awk 处理非常大的文件

awk 处理非常大的文件

我这里有一个文件,我想用 FILEB 和 FILEC 作为参考来标记每一行。

如果 fileb 或 filec 的第 1 列在 filea 的第 2 列中,则获取 fileb 或 filec 的第 2 列(如果 file c 的第 1 列不等于 63),否则打印“others”(参见 OUTPUT1)。

最终输出将是第 4 列(按 OUTPUT1 的第 2 列和第 5 列分组)和每列 5 的计数 (OUTPUT 1) 的总和。

菲亚

 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]}'

相关内容