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は偽。もう説明の必要はないですね。