Unix awk比较两个文件中的列,输入另一列的值

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

我想比较两个文件中的第二列。如果存在匹配项,则将第二个文件中第三列的对应值打印到第一个文件中。如果未找到匹配项,请填写“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      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
    :使用
    file2
    的seceond字段作为连接键
  • -a1
    :文件1上的左侧外部联接
输出:

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