LoginSignup
23
23

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-27

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

参考

23
23
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
23