利用シーン
- テキストファイルの1列だけ取り出して新たなファイルを作り加工しやすくしたい!
- でもPython開くのは億劫!
source activate ENV
してウンタラカンタラとかしてられない!
awkを使おう
awkっていうコマンドがbash, csh, zshなどシェルには存在して、それを使うと非常に便利です。
記述が大変なので導入しか書きませんが、色々出来て奥深いです、awk。
できること
- 行の要素の数を取り出す
- 特定の列の平均、標準偏差を計算できる
- シートの特定の列が特定の値である行を取り出せる
- っていうか多分PandasとかExcelでやっていることの大半を、コマンド一行で完結できそう
大雑把な文法
awk (オプション) (命令) (ファイル名)
と書きます。こちらは、シェル上で1行で書く場合です。
awk (オプション) -f (awkファイル名) (ファイル名)
とも書きます。awkコマンドが長くなったり使い回すことになったら、awkファイルに命令を書きだしましょう。
awkの命令
example.awk
BEGIN{
#各行を読む前に実行する命令を書く。
# 変数を定義したりする。
}
{
#各行で実行する命令を書く
}
END{
# 全行読んだあとに実効する命令を書く
}
例
$ awk -F\, '{ print $2 }' FILE_NAME # カンマ区切りして各行2列目を出力。FILE_NAMEにcsvファイルが来る場合など。
$ awk '{ print $2, $3 }' FILE_NAME # スペース区切りして各行2, 3列目を出力
$ awk '{ print $NF }' FILE_NAME # 最終列を表示
NFは予約語で、number of fieldかなんかです。$NFは最終列のセル、NFは要素の数を返します。
NRはnumber of rowです。まあ普通にwc -l FILE_NAME
でファイルの行数は出ますがね。
SQL的な使用方法
$ cat cols.txt
abc 1 2 3
def 4 5 6
ga 7 9 10
hij 1 5 99
$ awk '$2 == "1" { print $4 }' cols.txt
abc 1 2 3
hij 1 5 99