![awk 处理非常大的文件](https://linux22.com/image/102759/awk%20%E5%A4%84%E7%90%86%E9%9D%9E%E5%B8%B8%E5%A4%A7%E7%9A%84%E6%96%87%E4%BB%B6.png)
我这里有一个文件,我想用 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]}'