awkは非常に大きなファイルを処理します。

awkは非常に大きなファイルを処理します。

ここにファイルがあり、FILEBとFILECを参照として使用して各行を表示したいと思います。

fileb または filec の列 1 が filea の列 2 にある場合は、 fileb または filec の列 2 を取得し (ファイル c の列 1 が 63 と等しくない場合)、それ以外の場合は「others」を印刷します (OUTPUT1 を参照)。

最終出力は、列4(OUTPUT1の列2と5にグループ化されています)と各列(OUTPUT 1)の数5の合計です。

ぴあ

 63,234111,000,2
 63,234111,111,3
 56,456711,000,2
 63,678999,111,1

文書B

 234,XXX
 456,ZZZ

記録管理センター

 4567,YYY
 234,GGG

出力1

 63,234111,000,2,XXX
 63,234111,111,3,XXX
 56,456711,000,2,YYY
 63,678999,111,1,OTHERS

決定的な

 C1, C2,     C3,  SUM of C4, XXX, ZZZ, YYY, GGG, OTHERS
 63, 234111, 000, 5,         2,   0,   0,   0,   0
 56, 456111, 000, 2,         0,   0,   1,   0,   0
 63, 678999, 111, 1,         0,   0,   0,   0,   1

ここにスクリプトがありますが、非常に大きなファイルの場合は遅すぎます。

##tagging (ref fileb)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0==63 {print $0"~"a[$2+0]}' fileb filea > OUTPUT

##tagging (ref filea)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0!~63 {print $0,a[$2+0]}' filec OUTPUT > OUTPUT

##tagging others

awk -F~ '{if ($5 == "") print $0,"OTHERS"}' > OUTPUT

##sum and count

awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$2,$5]+=$4 }{arr2[$2,$5]++}END {for (i in arr) print i,arr[i],arr2[i]}'

関連情報