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. % 演算子