LoginSignup
2
1

More than 5 years have passed since last update.

awkを使ってテキストファイルから効率的にデータを集計する

Posted at

利用シーン

  • テキストファイルの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

参考文献

  1. A github gist
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1