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

如何根据awk中的第一列获取公共行,awk,Awk,我有两个分开的文件,如下所示: 文件1: A,inf B,inf C,0.135802 D,72.6111 E,42.1613 文件2: A,inf B,inf C,0.313559 D,189.5 E,38.6735 我想比较两个文件,并根据第1列得到公共行。因此,对于上述文件,输出如下所示: A,inf,inf B,inf,inf C,0.135802,0.313559 D,72.6111,189.5 E,42.1613,38.6735 join -t, <(sort file1

我有两个分开的文件,如下所示:

文件1:

A,inf
B,inf
C,0.135802
D,72.6111
E,42.1613
文件2:

A,inf
B,inf
C,0.313559
D,189.5
E,38.6735
我想比较两个文件,并根据第1列得到公共行。因此,对于上述文件,输出如下所示:

A,inf,inf
B,inf,inf
C,0.135802,0.313559
D,72.6111,189.5
E,42.1613,38.6735
join -t, <(sort file1) <(sort file2)
我正试图在
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
这不是我想要的。你知道我怎样才能改进它吗

$ 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

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

但是,如果文件按照问题中的示例进行排序,则只需使用
join
命令:

join -t, file1 file2
这将基于第一列连接文件<代码>-t,告诉join列之间用逗号分隔

如果文件未排序,您可以动态对其进行排序,如下所示:

A,inf,inf
B,inf,inf
C,0.135802,0.313559
D,72.6111,189.5
E,42.1613,38.6735
join -t, <(sort file1) <(sort file2)
join-t,