ファイル先頭から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文で累計を表示しました。
コメント