Unix awk比较两个文件中的列,输入另一列的值
我想比较两个文件中的第二列。如果存在匹配项,则将第二个文件中第三列的对应值打印到第一个文件中。如果未找到匹配项,请填写“NA” 我使用了此代码,但它只输出匹配项:Unix awk比较两个文件中的列,输入另一列的值,unix,awk,Unix,Awk,我想比较两个文件中的第二列。如果存在匹配项,则将第二个文件中第三列的对应值打印到第一个文件中。如果未找到匹配项,请填写“NA” 我使用了此代码,但它只输出匹配项: awk 'NR==FNR { a[$1]=$2; next} $1 in a {print $0, a[$1]}' File2 File1 多谢各位 awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' file2 file1 测试如下: > cat temp1 1
awk 'NR==FNR { a[$1]=$2; next} $1 in a {print $0, a[$1]}' File2 File1
多谢各位
awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' file2 file1
测试如下:
> cat temp1
1 rs1 AA 10
1 rs2 DD 20
1 rs3 EE 30
1 rs4 RR 40
> cat temp2
1 rs1 Pascal
1 rs4 Albinoni
> awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' temp2 temp1
1 rs1 AA 10 Pascal
1 rs2 DD 20 NA
1 rs3 EE 30 NA
1 rs4 RR 40 Albinoni
>
不完全是你想要的,但是使用小工具总是很好的。您可以使用: 说明:
:使用-12
的第二个字段作为连接键file1
:使用-2 2
的seceond字段作为连接键file2
:文件1上的左侧外部联接-a1
1 rs1 AA 10 Pascal
1 rs2 DD 20 NA
1 rs3 EE 30 NA
1 rs4 RR 40 Albinoni
非常感谢。它很好用。你能解释一下第二个动作部分中的“”是做什么的吗?@user2162153它附加了一个空格。您可以用它自定义分隔符。另一种方式是:
{printf“%s%s\n”,$0,($2在a?a[$2]:“NA”)}
谢谢。第二个条件,即如果第一个文件的$2存在于数组“a”中,则在“
之后写入。如果”
,则在之后附加a[$2]
(即文件2的$3
),如果文件1的$2
是a
中的一个键,则附加“NA”。只有排序后,Join才起作用。对于大文件,排序可能很慢。但是,一定要加入-o 1.1,1.2,1.3,1.4,2.3-e“NA”以获得所需的输出。在这种情况下,如何确定数组a的正确索引为$2
$ join -1 2 -2 2 -a1 file1 file2
rs1 1 AA 10 1 Pascal
rs2 1 DD 20
rs3 1 EE 30
rs4 1 RR 40 1 Albinoni
awk 'NR==FNR{a[$2]=$3;next;}{print $0 " " ($2 in a ? a[$2] : "NA")}' file2 file1
1 rs1 AA 10 Pascal
1 rs2 DD 20 NA
1 rs3 EE 30 NA
1 rs4 RR 40 Albinoni