如何根据awk中的第一列获取公共行

时间:2018-02-21 21:09:52

标签: awk

我有两个','个分隔文件,如下所示:

文件1:

A,inf
B,inf
C,0.135802
D,72.6111
E,42.1613

file2的:

A,inf
B,inf
C,0.313559
D,189.5
E,38.6735

我想比较2个文件,并根据第1列获取公共行。因此,对于上述文件,输出将如下所示:

A,inf,inf
B,inf,inf
C,0.135802,0.313559
D,72.6111,189.5
E,42.1613,38.6735

我试图在awk中尝试这样做并尝试过:

awk ' NR == FNR {val[$1]=$2; next} $1 in val {print $1, val[$1], $2}' file1 file2 

此代码返回此结果:

A,inf
B,inf
C,0.135802
D,72.6111
E,42.1613

这不是我想要的。你知道如何改进它吗?

2 个答案:

答案 0 :(得分:1)

$ awk 'BEGIN{FS=OFS=","}NR==FNR{a[$1]=$0;next}$1 in a{print a[$1],$2}' file1 file2
A,inf,inf
B,inf,inf
C,0.135802,0.313559
D,72.6111,189.5
E,42.1613,38.6735

说明:

$ awk '
BEGIN {FS=OFS="," }  # set separators
NR==FNR {            # first file
    a[$1]=$0         # hash to a, $1 as index
    next             # next record
}
$1 in a {            # second file, if $1 in a
    print a[$1],$2   # print indexed record from a with $2
}' file1 file2

答案 1 :(得分:1)

您的awk代码基本上有效,您只是错过告诉awk使用,作为字段分隔符。您可以通过将BEGIN{FS=OFS=","}添加到脚本的开头来完成此操作。

但是,如同问题中的示例中那样对文件进行排序,您只需使用join命令:

join -t, file1 file2

这将根据第一列加入文件。 -t,告诉联接,列以逗号分隔。

如果文件未排序,您可以像这样对它们进行排序:

join -t, <(sort file1) <(sort file2)