LinuxOSにはawkコマンドなるものがあります。テキストデータにフィルタをかけてくれる、フィルタコマンドと呼ばれるもので同レベルで高機能なものだとgrep コマンド ,sedコマンドがあります。今回は私の知っているawkの使い道をまとめました。
目次
- 基本の基
- 列について
- テキストファイルの成型
- プログラミング
- 終わりに
1.基本の基
awkコマンドは1列ごとの処理を行います。1万行のデータを読み込ませれば、1万行に繰り返し同じ処理を行います。
プログラミング言語として作られていますが、「1行目の情報を2行目に移動し~」というようなことを列も行も縦横無尽に
2.列について
awkコマンドにオプション(-F)を付けると、入力した情報を列に分けて解釈してくれます。
スペース区切り(デフォルトなのでオプション不要)、コマンド区切り(-F ‘,’)、タブ区切り(-F ‘\t’)、といった具合で区切り文字(Delimiter)を指定します。
列はawkコマンド内で$0(入力した行全部)、$1(1列目)、 $2(2列目)…と扱われます。
これの何がいいかというと、例えば下記のようにすることで1行目と2行目を入れ替えることができます。
1 |
awk -F ',' '{print $2,$1}' example.csv |
3.テキストファイルの成型
先述だけでなく、様々なフィルタがかけられます。例えば日付。
csvファイルから当月分のデータのみ取り出したい場合です。
※dateコマンドの部分は取り扱うファイルでの日時形式に従って書き換える必要があります。
1 2 3 4 5 6 7 |
awk -F ',' '{ some_date = $日付列の番号 -vnow_date = "`date -d'now' +'%Y/%m/%d %H:%M:%S'`" if ( some_date >= now_date && some_date <= now_date) { print $0 } }' example.csv |
日付で絞るというのはExcelでもできると思いますよね?しかしExcelは最大行数1,048,576までなのでこれを超えるファイルはawkコマンドが適切ということになります。また月次処理など、繰り返し行う作業であればコマンドにバチっとやってもらうのが適切でしょう。
4.プログラミング
awkコマンドはプログラミング言語として作られているので、色々とビルトイン変数が用意されています。ちょろっと10行程度の使い捨ての文字操作スクリプトを組む際にとても便利です。
他、小数点の計算がbashより桁落ちを気にせず手軽に書けます。
というわけで、個人的に有用と思うビルトイン変数を記述しておきます。他の変数や詳細については公式Docをご確認ください。
■ FS
入力データの列を区切る文字(Field Separator)。
デフォルトはスペース文字(” “)です。
スペース文字が指定されている場合は特別に、他にタブ文字も区切り文字と解釈されます。
また、区切り文字は正規表現を指定することもできます。
■RS
入力データの行を区切る文字 (Record Separator)。
デフォルトは改行文字(“\n”)です。
■ OFS
出力データの列を区切る文字(Output Field Separator)。
デフォルトは空白文字(” “)です。
■ ORS
出力データの行を区切る文字(Output Record Separator)。
デフォルトは改行文字(“\n”)です。
■ FILENAME
awkコマンドに引数で渡したファイル名。
■ NF
現在行の列数(Number of Fields)。例えばif文で「4列目のみこの処理をする」というようなことができます。
■ NR
現在行の行数(Number of Records)。 例えばif文で「1行目以外はこの処理をする」というようなことができます。
5.最後に
公式Docをしげしげと読みながら書いている時が、インフラエンジニアの端くれでもアプリのような高レイヤをやれているような気がして楽しいです。かなり簡素な言語ですが。