headの代わりにsedやawkを使う

ファイル先頭から10行抽出できるheadですが、オプションなしで使えることがすごいところだと思っています。「head」4文字で使えてしまうためheadの代用をするコマンドがあっても、headの短さには敵わないでしょう。

~$ seq 100 | head
1
2
3
4
5
6
7
8
9
10
~$ 

awkで同じことをやってみましょう。

~$ seq 100 | awk 'NR<=10{print}'
1
2
3
4
5
6
7
8
9
10
~$ 

あるいはこうです。

~$ seq 100 | awk 'FNR<=10'
1
2
3
4
5
6
7
8
9
10
~$ 

headの代わりにawkを使うには、’や{}等の記号が必要になり、やはりコマンドが長くなってしまいます。awkはプログラミング言語なので仕方がないかもしれません。
では、headではできないようなことをしてみましょう。
ファイルの先頭行から6行ごとに抽出してみます。

~$ seq 100 | awk 'NR%6==1{print}'
1
7
13
19
25
31
37
43
49
55
61
67
73
79
85
91
97
~$ 

これはheadではできません。しかしながら絶対awkではないと無理ということでもありません。
sedでもできます。しかも、コマンドが短く済んでしまいます。

~$ seq 100 | sed -n 1~6p
1
7
13
19
25
31
37
43
49
55
61
67
73
79
85
91
97
~$ 

sedの-nはデフォルト非表示の意味で、pコマンドの条件が満たさなければ何も表示されません。今回は、ファイルの行番号が1行目から6行毎に当たる行番号であれば、p(print)する指定となっています。sedは上手くオプションを使えば、awkと比べてほとんど短くコマンド形成できます。
さて、sedはエディタですが、awkはプログラミング言語です。次は、sedではできず、awkにできることをやってみます。

~$ seq 100 | awk 'NR%6==1{sum+=$1;print}END{print "SUM =",sum}'
1
7
13
19
25
31
37
43
49
55
61
67
73
79
85
91
97
SUM = 833
~$ 

sumという変数を作成して、各行の内容をsumに加算してから、
そして、awkの最終処理をするENDブロック内に記述したprint文で累計を表示しました。

One response to “headの代わりにsedやawkを使う

  1. Your articles are for when it abeslutoly, positively, needs to be understood overnight.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA