UNIXコマンド テキスト処理を色々試してみた2 〜AWK〜

UNIXコマンド テキスト処理を色々試してみた1 - oknknicの日記」に引き続きUNIXコマンドネタ。
今回は AWK 。C同様の文法でシェル上でさっと処理書いてさっと実行できるのは嬉しい。
かなり強力で何でもできるが、他のシンプルなコマンドで実現できることまで無理にやってしまわないよう、注意するといいだろう。

パターンマッチ&プロセシング - awk

複数列の選択

#CSVのフィールド1とフィールド3を抽出
printf "item1,item2,item3\nitem4,item5,item6" | awk -F ',' '{print $1 "," $3}'

集計

#合計
printf 'taro 10\nhanako 13\n ichiro 7\n' | awk '{sum+=$2} END{print sum}'
#平均
printf 'taro 10\nhanako 13\n ichiro 7\n' | awk '{sum+=$2; count++} END{avg=sum/count; print avg}'

#ファイルサイズの合計
ls -la | grep '^-' | awk '{sum+=$5}END{print sum}'

行の絞り込み(複数パターン可能&パターン毎に異なる処理が可能)

#正規表現で行を絞る
printf "item1,item2,item3\nitem4,item5,item6" | awk -F ',' '/item2/{print $1 "," $3}'

#フィールドの等価比較で行を絞る
printf "item1,item2,item3\nitem4,item5,item6" | awk -F ',' '{if($2 == "item2"){print $1 "," $3}}'

パディング

seq 1 1 10 | awk '{printf "%05d\n", $1; }'

#(参考)printfコマンドでも同様
printf "[%03d]\n" 5
printf "[% 8s]\n" hoge

# ファイル一覧を、ファイルサイズ10桁表示+タブ+ファイル名で表示
ls -l | grep -v ^total | awk '{printf "%010d\t%s\n", $5, $9}'
メモ
  • BEGIN{} 開始時に1回だけ実行
  • //{}   パターンにマッチする各行について実行
  • END{}  終了時に1回だけ実行