10.21.2011

Joining two files in AWK

AWK: 2個のファイルの結合

N行の file0 と M行の file1 を共通のキーを元に結合する。(N, M > 0)
AWKを使い、少ない計算量で実現したい。

・file0

   1: 1 one
   2: 2 two
   3: 3 three
   4: 4 four
   5: 5 five

・file1
   1: 3
   2: 5
   3: 2
   4: 4
   5: 1
   6: 2
   7: 3
   8: 5


この時、組み込み変数「NR(入力行)」と「FNR(ファイルの入力行)」を使用したトリッキーなレシピがある。

・num_to_alpha.awk

   1: #!/usr/bin/nawk -f
   2:  
   3: NR == FNR {
   4:   dict[$1] = $2
   5:   next
   6: }
   7:  
   8: {
   9:   print dict[$1]
  10: }

NR=FNR の場合、現在のレコードは最初のファイルであることと同値。
2個目のファイルであれば、NR=N+FNR となるからだ。

最初のファイルの読み込みでは、データをメモリへ格納するのみ。
2個目のファイルの読み取りの際に、連想配列からデータを参照して出力する。

・出力結果

   1: $ ./num_to_alpha.awk ./file0 ./file1                                          
   2: three
   3: five
   4: two
   5: four
   6: one
   7: two
   8: three
   9: five

これで計算量はO(N + M log N)となる。

参考:
http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_11.html

0 件のコメント:

コメントを投稿