(Linux)headの代わりにsedやawkを使う(head sed awkの良いところ)

3-1.部分抽出

ファイル先頭から10行抽出できるheadですが、オプションなしで使えることがすごいところだと思っています。

「head」4文字+ Enterを入力するだけでで使えてしまうため、headの代用をするコマンドがあっても、headの使い勝手には敵わないでしょう。

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

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

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

あるいはこうです。

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

awk(gawk)をheadの代わりにするには、’や{}等の記号が必要になり、やはりコマンドが長くなってしまいます。
awkはプログラミング言語なので仕方がないかもしれません。

では、headだけではできないようなことをしてみましょう。
ファイルの先頭行から6行ごとに抽出してみます。

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

これはheadではできません。

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

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

sedの-nはデフォルト非表示の意味で、pコマンドの条件が満たさなければ何も表示されません。

ファイルの行番号が1行目から6行毎に当たる行番号であれば、p(print)する指定となっています。
このようにsedは上手くオプションを使えば、awkと比べてほとんど短くコマンド形成できます。

さて、sedはエディタですが、awkはプログラミング言語です。次は、sedではできず、awkにできることをやってみます。

takk~$ 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
takk~$ 

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

コメント

タイトルとURLをコピーしました