usptomonokai 20111028
TRANSCRIPT
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
AWK AWK でででででででで
アクションレスアクションレスアクションレスアクションレスアクションレスアクションレスアクションレスアクションレス・・・・・・・・プログラミングプログラミングプログラミングプログラミングプログラミングプログラミングプログラミングプログラミング
日本 GNU AWK ユーザー会
斉藤 博文 (@hi_saito)
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
AWK AWK のののの基本文法基本文法基本文法基本文法のののの基本文法基本文法基本文法基本文法
BEGIN { ACTION }
PATTERN { ACTION }
END { ACTION }
Point!
• BEGIN や END も同じ PATTERN と考えると分かりやすいね
• ついでに K&R スタイルで書くと統一感が出るね
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
K&R K&R スタイルスタイルスタイルスタイルってってってって何何何何スタイルスタイルスタイルスタイルってってってって何何何何??
if (なんとかなんとかなんとかなんとか)
{
かんとかかんとかかんとかかんとか;
}
if (なんとかなんとかなんとかなんとか) {
かんとかかんとかかんとかかんとか;
}
オールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイルオールドマンスタイル
K&R K&R スタイルスタイルスタイルスタイルスタイルスタイルスタイルスタイル
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
パターンパターンパターンパターンはははは不要不要不要不要パターンパターンパターンパターンはははは不要不要不要不要??
PATTERN { ACTION }
{
if (PATTERN) {
ACTION;
}
}
Point!
• パターンは先頭になくてもプログラムを組めるんです
gauc.no-ip.org
USP 友の会総会 (2011/10/28)
神神神神々々々々のののの言葉言葉言葉言葉神神神神々々々々のののの言葉言葉言葉言葉
•神は言っている「awk は使い捨てプログラムである」と
• We just wanted to have a very simple
scripting language that would allow us
<snip> to be able to write throw-away
programs for routine data processing.
(Prof. Aho)
Point!
• awk が真価を発揮するのは「一行野郎」
• AWKer はワンライナーとかライフライナーみたいな言葉は使ってはいけない
Japan GNU AWK Users' Club
gauc.no-ip.org
USP 友の会総会 (2011/10/28)
PATTERN PATTERN だけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなるだけだとどうなる??
• { ACTION } が省略された場合、{print $0} と
同じ扱いになる
Japan GNU AWK Users' Club
PATTERN PATTERN ってってってって一体何者一体何者一体何者一体何者ってってってって一体何者一体何者一体何者一体何者??
• PATTERN は「パターン」そのものではなく評価式で、
0 か空文字列以外は「真」になり、{print $0} が実
行される
Point!
• ちょっと便利な grep 程度?
gauc.no-ip.org
USP 友の会総会 (2011/10/28)
神神神神々々々々のののの言葉言葉言葉言葉神神神神々々々々のののの言葉言葉言葉言葉
•神は言っている「awk は grep から産まれた」と。
• We were heavily influenced by GREP.
(Prof. Aho)
Japan GNU AWK Users' Club
Point!
• そんな装備で大丈夫か?
• 大丈夫。問題ない。
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
正規表現正規表現正規表現正規表現へのへのへのへの正規表現正規表現正規表現正規表現へのへのへのへのマッチングマッチングマッチングマッチングマッチングマッチングマッチングマッチング ((grepgrep))
$0 ~ /RegExp/ {print $0}
Point!
• g/re/p の g と p は {print $0} と等価なので、まさに grep
$0 ~ /RegExp/
/RegExp/
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
空行空行空行空行ととととスペーススペーススペーススペースだけのだけのだけのだけの行行行行をををを削除削除削除削除空行空行空行空行ととととスペーススペーススペーススペースだけのだけのだけのだけの行行行行をををを削除削除削除削除
length($0) > 0 && $0 !~ /^[ ¥t]+$/
{print $0}
length($0) > 0 && $0 !~ /^[ ¥t]+$/
length($0) && !/^[ ¥t]+$/
NF
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
$0 $0 以外以外以外以外をををを表示表示表示表示するするするする場合場合場合場合はははは以外以外以外以外をををを表示表示表示表示するするするする場合場合場合場合はははは??
• AWK は破壊的に値が代入される
• 常に代入は「真」になる
• つまり $0 に欲しいものを代入すればいい
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
$1 $1 をををを表示表示表示表示するするするするをををを表示表示表示表示するするするする
{print $1}
{$0 = $1; print $0}
$0 = $1
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
置換置換置換置換だってできちゃうだってできちゃうだってできちゃうだってできちゃう置換置換置換置換だってできちゃうだってできちゃうだってできちゃうだってできちゃう
{sub(/RegExp/, "STR", $0); print $0}
sub(/RegExp/, "STR") || 4
Point!
• sub() の戻り値は置換された個数
• 1 だと l なのか | なのか I なのか分かりづらいので 4 が好まれるみたい
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
区切区切区切区切区切区切区切区切 (OFS)(OFS) をををを表示表示表示表示するするするするをををを表示表示表示表示するするするする
BEGIN {OFS="¥t"} {print $1}
$ awk -v OFS="¥t"{$1 = $1; print $0}
$ awk -v OFS="¥t" '$1 = $1'
Point!
• これを「フィールドの再構成」といいます
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
改行改行改行改行改行改行改行改行 (ORS) (ORS) をををを変更変更変更変更するにはするにはするにはするにはをををを変更変更変更変更するにはするにはするにはするには??
BEGIN {OFS = "¥n¥n"} {print $0}
BEGIN {OFS = "¥n¥n"} 4
Point!
• print $0 は printf("%sOFS", $0) なので、再構成が不要
ORS = "¥n¥n"
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
みんなみんなみんなみんな大好大好大好大好ききききみんなみんなみんなみんな大好大好大好大好きききき FizzBuzzFizzBuzz
$ seq 100 | ¥
awk
'$0=($0%15)?($0%5)?($0%3)?$0:"Fizz":
"Buzz":"FizzBuzz"'
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
head, tail head, tail はははははははは??
NR <= 10
headhead
$ tac | awk 'NR <= 10' | tac
tailtail
Point!
• そもそも awk で tail なんか作ってはいけない
• shell と awk を合わせて活用すべし
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
まとめまとめまとめまとめまとめまとめまとめまとめ
• 資源の有効活用 (エコ活動)
• 頭の体操になる (ボケ防止)
• awk だけで記述できない (Shell の勉強もできる)
• さぁ、みんなも今日からアクションレス・プログラミングを
しよう!
Japan GNU AWK Users' Club gauc.no-ip.org
USP 友の会総会 (2011/10/28)
最後最後最後最後にににに最後最後最後最後にににに
• 「日本 GNU AWK ユーザー会」は「USP 友の会」と友
好団体になります?
• Shell と awk の融合による無限の可能性に乞ご期
待?
• http://gauc.no-ip.org/gawk-users-jp/
Point!
• ただし「日本 GNU AWK ユーザー会」と契約しても魔法少女にはなれません