ShellScript
awk

awkのシンタックスシュガー?

More than 3 years have passed since last update.


awkの小ネタ

awkってクセあるからメモ。


環境


  • CentOS 6.5 x64

  • GNU Awk 3.1.7


パターンアクション

基本はパターンアクション

 pattern { action statements }


真偽

boolはない。偽は空白と0、真はそれ以外。

http://codezine.jp/article/detail/7752


空行削除

パターンに$0のみ、アクションなしで実行します。空白は偽のため出力されません。

$ awk '$0' aiai.txt

アイアイ アイアイ
おさるさんだよ
アイアイ アイアイ
みなみのしまの


カラム数n個以上

今度はパターンを'$2'にします。2カラム目が空白なものは出力されません。よってカラム数が2以上のものを出力します。

$ awk '$2' aiai.txt

アイアイ アイアイ
アイアイ アイアイ

!を付ければ逆になります。

$ awk '!$2' aiai.txt

おさるさんだよ
みなみのしまの


偶数行

偶数行を出力するには、NR(number of records)を使います。クセありますねー。

$ cat -n  aiai.txt | awk '! (NR % 2)'

2 おさるさんだよ
4 みなみのしまの
$ cat -n aiai.txt | awk '(NR % 2) == 0'
2 おさるさんだよ
4 みなみのしまの


重複排除

ここまでくれば次のコードは納得できるかと。

私は初めてみたとき、これはどういう理屈か理解できませんでしたよ。

$ cat aiai.txt

アイアイ アイアイ
おさるさんだよ
アイアイ アイアイ
みなみのしまの

$ awk '!x[$0]++' aiai.txt
アイアイ アイアイ
おさるさんだよ
みなみのしまの

見事な重複排除ですね。awkの連想配列をうまく使っています。

x[$0]++をアクションで出力するとわかりやすいです。

$ awk '{ print !x[$0]++ }' aiai.txt

1
1
0
1

1は真、0は偽。もう説明の必要はないですね。


参考