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)となる。
0 件のコメント:
コメントを投稿