awk
- 行単位でデータファイルを様々に加工する awk(おーく)は、入力データ1行ごとに各列の様々な処理を行うコマンドである。 ここで、行とはファイルデータの横のライン、列とは縦のラインである。 awkを用いると、例えば「ファイルの2列目を2倍する」というような操作もコマンドライン一行で可能になる。
基本形は、
% awk '条件文{実行文}' ファイル名
である。'は「Shiftキー+数字の7」である。括弧は「中括弧」{}でなくてはならない。 また、条件文は省略可能である。 例えば、3列あるデータファイルのうち、1列目はそのまま、2列目は2倍、3列目は3で割りたいというときは、% awk '{print $1,$2*2.0,$3/3.0}' datafile
とする。ここで、print文中の$1は1列目を表す。各列は,で区切る。print文中ではC言語の主な演算記号が使える。 以下に、awkによる処理の例を挙げる。% awk '$1 > 4.0{print}' datafile ある条件に一致した行のみを出力する。この例は一列目が4.0よりも大きければ出力。 print文で列を指定しなければ全列が出力される。$0と明示的に指定することも可能。
% awk '$1 <= 5.0 {print $3} $1 > 10.0 {print $2}' datafile 複数の条件によって出力パターンを変える。 例では、1列目が5以上なら3列目を出力し、1列目が10より大きければ2列目を出力。
% awk `$1 == "S"{print}` datafile 条件文の中で比較対象が文字の場合は、""で括る。
% awk '$1 !~ "#"{print}' datafile 読み飛ばしたい行には行頭に#をつけ、#をコメントアウト行と認識させる。 #で始まる行はスキップする。正確には、1列目に#が含まれていなければ出力する。 ~はその列にある文字が含まれている時という条件を表し、 !は直後の条件を否定(not)する。
% awk '{printf("%d %f %s\n",$1,$2,$3)}' datafile 出力書式を指定したいときに用いる。 printfの用法はC言語のprintfに準ずる。
% awk 'NF >0 {print $1}' datafile 空行をスキップさせる。 NFはawkの変数で、現在読み込んでいる行の列(フィールド)の数を表す。
% awk '{if ($1 == "B" || $1 == "N") print "B"; else print "C"}' datafile if/else文。複雑な条件文を組み込む。 if文以下の||は「または」(or)を表す。「かつ」(and)は&&。
% awk '{if ($1 !~ "#") if ($1 == 0 && $2 == 0) print $0,0.5,"r"; else print $0,$1/($1+$2); else print "# is escaped."}' datafile 同じくif/else文。二重に入れ子になっているとき。 上記の例は二行に分けてあるが、実際は一行につなげて書く。
% awk 'NR==1{s0=$1 } NR!=1{r=$1-s0; s0=$1; print r}' datafile 前後の行での処理。例は、1列目において、1行前の値を今の行の値から引いて出力する。 1行目では今の値を保持させるのみとし、2行目以降で引き算を行っている。 NRはNFと同様にawkの変数で、処理をした行の数を表す。 s0というのは、自分で設定した変数。ここに前の行の一列目の値を保持させている。
awk内の変数を挙げる。- NF :列の数
- NR :行の数。
- FILENAME :今読み込んでいるファイルの名前
2011年11月10日木曜日
使いこなせ!シェルスクリプト!!データ解析
http://www.e.ics.nara-wu.ac.jp/~nogu/tips/unix_command.html
登録:
投稿 (Atom)