はじめに
最近AWKを使って他のコマンドの出力を加工することが多いため、使い方を覚えておくために記事として残しておきたいと思います。
s
AWKとは
- LinuxやMacで使用可能なコマンド(プログラミング言語)
- 入力として与えたテキストを加工して出力できる
コマンド例
例えば次のようなCSVファイルを想定します。
sample.csv
id,price
0,100
1,10
2,200
3,150
4,100
CSVファイルの特定の列だけを切り出して表示することや
コマンド
cat sample.csv | awk -F'[,]' '{print $2}'
出力
price
100
10
200
150
100
列の合計を計算することができます。
コマンド
cat sample.csv| awk -F'[,]' 'NR>1{sum += $2} END {print sum}'
出力
560
よく使用するコマンド
空白区切りでn列目を表示
-
$0
で入力行全体、$1
~で入力を空白区切りにした場合の1列目、2列目、・・・を表示します
{任意のコマンド} | awk '{print $2}'
任意の区切り文字でn行目を表示
-
-F
の直後に区切り文字にしたい文字を設定します - 区切り文字は2文字以上でも設定可能です
- 組み込み変数である
FS
を使用しても区切り文字を変更することができます
# "="を区切り文字として2列目を表示
{任意のコマンド} | awk -F= '{print $2}' # -Fオプションを使用する場合
{任意のコマンド} | awk -v FS="=" '{print $2}' # 組み込み変数を使用する場合
先頭行を除いた残りの行を表示
- コマンドやファイルからヘッダ行を取り除きたい場合に使用します
- NRはビルトイン変数であり、現在行のレコード番号を表します
{任意のコマンド} | awk 'NR>1{print $0}'
n行目のみを表示
- 指定した行のみを取り出したい場合に使用します
- 行指定より
grep
で絞り込んでしまうことが多いのであまり使わないかも
# 2行目だけを表示する場合
{任意のコマンド} | awk 'NR==2{print $0}'
最終行のみを表示
- 最後に必要な情報(集計結果など)がある場合に、その行だけ取り出したい場合などに使用します
-
END
を使用することで最後の行でのみ処理が実行されます -
tail
と組み合わせても同じことができます
{任意のコマンド} | awk 'END{print $0}'
四則演算
- 出力に対して加減乗除などの演算子が使用できます
- 出力の単位を変換したり、オフセットを加えるなどの用途で使用できます
echo 10 | awk '{print $1 + 1}' # 11
echo 10 | awk '{print $1 - 1}' # 9
echo 10 | awk '{print $1 * 2}' # 20
echo 10 | awk '{print $1 / 2}' # 5