【awk】「列毎に別処理」or「特定の列のみに処理」

シェルスクリプトで列毎に別処理を行ったり、特定の列のみに処理を行いたいときがある。
for文やwhile文で行うのも手だが、アクセスログなどの大きいデータを処理する時には時間がかかってしまい使い物にならない。
awkを用いることで高速に処理することができる。

フォーマットはこのようになる。

awk '{"[任意のOSコマンド]" | getline [コマンドの戻り値が入る変数]; printf([出力])}'

実行例

cat access.log | awk '{"date -d "$4" '+%Y/%m/%d'" | getline date; printf("%s %s\n", date, $1)}'`

この例は、アクセスログの時間フォーマットを変更し、[フォーマット変更後の時間 IP]を出力している。
awkで列を抽出しながらawk内でOSコマンドを用いて抽出部分を処理し、最後に結合している。
awkは並列処理なのでfor文やwhile文よりとても高速である。