awkで特定のフィールドだけを抜き出す

awkでは入力をデフォルトで行単位のレコードとして読み込み、さらにそれをフィールドに分割します。フィールドは組み込み変数FS(Field Separater)で分割したモノであり、デフォルトはスペースとタブです。フィールドには左から順に$1, $2と番号が割り振られていくため、特定のフィールドを抜き出したい時はこれを利用します。例えば、2列目の文字だけを取り出したい場合は以下のように書けます。

$ echo a b c | awk '{print $2}'
b

ちなみに、$0は入力全体を表します。

$ echo a b c | awk '{print $0}'
a b c

また、組み込み変数NFを使って最後から(右から)何番目かでフィールドを指定することができます。組み込み変数NFが何を現すかというと、そのレコードのフィールド数です。

$ echo a b c | awk '{print NF}'
3

これを使って最後から何番目かでフィールドを指定できます。

$ echo a b c | awk '{print $NF,$(NF-1),$(NF-2)}'

ここではNFは3になるので、以下のコマンドと等価です。

$ echo a b c | awk '{print $3,$2,$1}'

おまけ

指定のフィールドを抜き出すだけなら以下のような書き方もできます。

$ echo a b c | awk '$0=$2'
b

これは、アクションが省略された場合にawkは {print $0} を実行するためです。非明示的でトリッキーに見えますが、シェル芸などにぜひ。

参考:

blog.kanezoh.com