【问题标题】:awk Lookup 2 files, print match and Sum of Sencond Field:awk 查找 2 个文件,打印匹配和 Sencond 字段的总和:
【发布时间】:2014-02-07 16:38:28
【问题描述】:

对于这种情况,我需要比较 f1.txt 和 f2.txt 两个文件并获取匹配项和不匹配项 我正在检查 f1.txt 的第二个字段是否与 f2.txt 的第一个字段匹配,如果是的话 然后打印 f1.txt 的整行并打印 f2.txt 的第一个字段和 f2.txt 的第二个字段的总和。并且在 f1.txt 上找不到匹配项以声明“NotFound”。

f1.txt

aa,10,cc,Jan-13
bb,20,cc,Feb-13
dd,50,cc,Mar-13

f2.txt

10,1500,ss
20,500,gg
10,2000,kk
10,15000,yy
20,500,zz,
35,250,tt

输出.txt

aa,10,cc,Jan-13,10,18500
bb,20,cc,Feb-13,20,1000
dd,50,cc,Mar-13,NotFound,NotFound

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    这个awk应该这样做

    awk -F, 'FNR==NR {a[$1]+=$2;next} {if ($2 in a) print $0,$2,a[$2]; else print $0,"NotFound","NotFound"}' OFS=, f2.txt f1.txt
    aa,10,cc,Jan-13,10,18500
    bb,20,cc,Feb-13,20,1000
    dd,50,cc,Mar-13,NotFound,NotFound
    

    它是如何工作的:

    awk -F, '                                       #Set Field separator to ,
        FNR==NR {a[$1]+=$2;next}                    #Read data from file f2.txt using field #1 as index and sum field #2 in to array a
        {if ($2 in a)                               #Test if field #2 in f1.txt is found in a
            print $0,$2,a[$2]                       #If found, print line of f1.txt with sum and index from array
            else print $0,"NotFound","NotFound"     #If not found print line of f1.txt with NotFound
        }
        ' OFS=, f2.txt f1.txt                       #Set Output field separator to , and read files
    

    略短的版本:

    awk -F, 'FNR==NR {a[$1]+=$2;next} {print $0 ","($2 in a?$2","a[$2]:"NotFound,NotFound")}' f2.txt f1.txt
    

    【讨论】:

      最近更新 更多