tail by awk2011年05月26日 18時34分01秒

今回は awk で tail を実装する。tail はファイルの最後から行数を数えるので、色々と面倒になる。今までは、入力行をそのまま出力するか、ちょっと加工して最後に簡単な出力だけで終わっていた。tail が難しいのは、複数の行を保持しておかないといけないから。そこで、配列を用いる。

awk の配列はいわゆる連想配列で、任意の鍵をインデックスとして用いて値を保存することが出来る。もちろん、数字を用いても良い。

一つの制約として、変数を配列として用いると、それ以降は配列としてしか使えなくなる。スクリプトが大きくなると、意図せずに混ぜてしまいエラーになることがある。

単純に tail で十行表示する。


% tail /etc/services     
isode-dua       17007/udp
biimenu         18000/tcp  #Beckman Instruments, Inc.
biimenu         18000/udp  #Beckman Instruments, Inc.
wnn4            22273/tcp  wnn6         #Wnn4 (Japanese input)
wnn4_Cn         22289/tcp  wnn6_Cn      #Wnn4 (Chinese input)
wnn4_Kr         22305/tcp  wnn6_Kr      #Wnn4 (Korean input)
wnn4_Tw         22321/tcp  wnn6_Tw      #Wnn4 (Taiwanse input)
wnn6_DS         26208/tcp  #Wnn6 (Dserver)
dbbrowse        47557/tcp  #Databeam Corporation
dbbrowse        47557/udp  #Databeam Corporation

まず最初の実装は単純に配列の 0 から 9 に入力行を保持する。一行読む毎に、一行ずつ動かして、常に十行保持している。愚直で遅い実装だが、END 句では単純に print すれば良い。

% nawk '{for(i = 9; i >=0; i--)line[i+1] = line[i]; line[0]=$0}END{for(i = 9; i >=0; i--)print line[i]}' /etc/services
isode-dua       17007/udp
biimenu         18000/tcp  #Beckman Instruments, Inc.
biimenu         18000/udp  #Beckman Instruments, Inc.
wnn4            22273/tcp  wnn6         #Wnn4 (Japanese input)
wnn4_Cn         22289/tcp  wnn6_Cn      #Wnn4 (Chinese input)
wnn4_Kr         22305/tcp  wnn6_Kr      #Wnn4 (Korean input)
wnn4_Tw         22321/tcp  wnn6_Tw      #Wnn4 (Taiwanse input)
wnn6_DS         26208/tcp  #Wnn6 (Dserver)
dbbrowse        47557/tcp  #Databeam Corporation
dbbrowse        47557/udp  #Databeam Corporation

今回の要点。

  1. 連想配列

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2011/05/26/5881139/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。