如何根据awk中的第一列获取公共行
我有两个分开的文件,如下所示: 文件1:如何根据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
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,