awkの細道・その1

タブ区切りテキストのカラム切り出しはUNIXコマンドラインでは、これまでも紹介したように [shell] cut -f2 arraytable.txt > column2.txt [/shell] みたいな感じで、arraytable.txtファイルの左から2番目のカラムだけを切り出して、column2.txtファイルに書き込むみたいなことを日常茶飯事的に実行する。 同じことをawkでもワンライナーで実行できて、 [shell] awk '{ print $2 }' arraytable.txt > column2.txt [/shell] とやればいい。

しかしながら、カラムの値にスペースが入っていたりするとこれがうまくいかなくなる。それはカラムをわけるデリミタ(とかファイルセパレータ)がdefaultではスペースもしくはタブという具合になっているからだ。そうなるとちょっと工夫が必要となってくる。 もちろんcutコマンドの-dオプションで指定してもいいのだが、敢えてawkでそれをやるスクリプトを紹介する。 [shell] BEGIN { FS="t" } { if( $16 > 1 ) { print $11 "t" $16 }} [/shell] この例では11カラム目がIDで、16カラム目が発現変動の比で、それが1以上になったものだけをIDとともにタブ区切りテキストで出力するというものである。この内容をcut.awkという名前のファイルとして保存して、以下のようなコマンドで実行すれば結果が得られる。 [shell] awk -f cut.awk arraytable.txt > result.txt [/shell] もちろん、PerlやRubyスクリプトを書けばいいのだけれども、「awkの細道」ということで。

追記:実は、16カラム目が行末で、どうしても1以上の値が取れてこないなあと思ったら…やはり改行問題でrが悪さしてた。 [shell] perl -i~ -pe 's/r//g' arraytable.txt [/shell] でrを排除すると、うまくいくように。みなさんもお気をつけて。


Written by bonohu in misc on 火 21 1月 2014.