根据两个文件中第一列的所有可用值合并两个文件

根据两个文件中第一列的所有可用值合并两个文件

我需要合并以下两个文件:

  • 文件1:

    viewer  23
    test    27
    remark  2
    
  • 文件2:

    viewer  2990
    exam    200
    remark  240
    

合并后的文件应如下所示:

type    value1  value2  difference
viewer  23      2990       -2967
test    27        0          27
remark  2        240        -238
exam    0        200        -200

答案1

“x”文件:

FNR==1 {
    ++FILENO
}
{
    T[$1]++
    X[$1,FILENO]=$2
}
END {
    print "type\tvalue1\tvalue2\tdifference"
    for(t in T)
        print t"\t"X[t,1]+0"\t"X[t,2]+0"\t"0+X[t,1]-X[t,2]
}

运行:

$ awk -f x file1 file2
type    value1  value2  difference
viewer  23      2990    -2967
remark  2       240     -238
test    27      0       27
exam    0       200     -200

带有“总计”行的版本,排序和跳过行没有区别:

FNR==1 {
    ++FILENO
}
{
    T[$1]++
    X[$1,FILENO]=$2
}
END {
    print "type\tvalue1\tvalue2\tdifference"
    for(t in T) {
        if(X[t,1]!=X[t,2])
            print t"\t"X[t,1]+0"\t"X[t,2]+0"\t"0+X[t,1]-X[t,2] | "sort"
        S[1]+=X[t,1]
        S[2]+=X[t,2]
    }
    close("sort")
    print "total\t"S[1]+0"\t"S[2]+0"\t"S[1]-S[2]+0
}

我在两个输入文件中添加了一行“yawns 3”...

文件1:

yawns   3
viewer  23
test    27
remark  2

文件2:

viewer  2990
yawns   3
exam    200
remark  240

跑步:

$ awk -f x file1 file2
type    value1  value2  difference
exam    0       200     -200
remark  2       240     -238
test    27      0       27
viewer  23      2990    -2967
total   55      3433    -3378

...并且“哈欠”不会显示在输出中。

GAWK 可以在没有外部的情况下进行排序sort,但只要可能,我不喜欢取消 GAWKy 功能。

答案2

另一个awk解决方案:

$ awk '
FNR==NR {
    a[$1] = $2;
    c[$1] = $1;
    next;
}
{
    b[$1] = $2;
    c[$1] = $1;
}   
END {
    printf "type\tvalue1\tvalue2\tdifference\n";
    for(i in c)
        printf "%s\t%d\t%d\t%d\n", i, a[i], b[i], a[i]-b[i]
}' file1 file2
type    value1  value2  difference
remark  2       240     -238
test    27      0       27
viewer  23      2990    -2967
exam    0       200     -200

相关内容