tail by awk 22011年05月28日 14時13分02秒

前回の tail から改良。前回の実装は単純な実装な為、とても遅い。そこで、今回は一行ずつずらすのではなく、書き込んだ位置を覚えておく。覚えておくと言っても awk が既に NR に読んだ行数を保存している。

% nawk '{line[NR % 10] = $0}END{for(i = 0; i < 10; i++)print line[(NR + i) % 10]}' /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

% 演算子を使って、出力する行を決める。余計な行の移動が無くなったので、プログラムも若干簡潔になった。

% 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

awk のプログラムは他の言語とは異なる。他の言語では、全体としてどう処理するかを考えてプログラムを書く。例えば、ファイルを開き、一行ずつ読み込みながら何をするのかを考えてから、一行ずつの処理を書く。awk では、一行ごとをどのように処理すれば良いのかを考えてから、プログラムを書く。また、そこらへんが awk 初心者にとっての、違和感にもなっている。

今回の要点。

  1. NR 変数
  2. % 演算子

コメント

コメントをどうぞ

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

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

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

トラックバック

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

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