Awk 如何导入与两个文件中的一个公共字段相对应的其他列中的字段,在所有不匹配的列中使用'NA'

Awk 如何导入与两个文件中的一个公共字段相对应的其他列中的字段,在所有不匹配的列中使用'NA',awk,Awk,我想问一个关于我之前发布的问题的后续问题: 我正在试图找出当我有几个不匹配的值时如何打印NA File1 rs1 AA 10 rs2 BB 20 rs3 CC 30 rs4 DD 40 File2 rs1 QQ TT UU rs3 RR WW rs4 ZZ Desired output rs1 AA 10 QQ TT UU rs2 DD 20

我想问一个关于我之前发布的问题的后续问题:

我正在试图找出当我有几个不匹配的值时如何打印
NA

File1

rs1    AA    10
rs2    BB    20
rs3    CC    30
rs4    DD    40


File2

rs1    QQ   TT   UU
rs3    RR   WW   
rs4    ZZ      

Desired output

rs1    AA    10    QQ   TT   UU
rs2    DD    20    NA   NA   NA       
rs3    EE    30    RR   WW   NA
rs4    RR    40    ZZ   NA   NA
仅当整个
$0
丢失时,此代码才会打印
NA

awk 'FNR==NR{a[$1]=$0;next}{print $0,a[$1]?a[$1]:"NA"}' file2 file1

Current output:

rs1    AA    10    QQ    TT    UU
rs2    DD    20    NA
rs3    EE    30    RR    WW
rs4    RR    40    ZZ     
像这样的

awk 'FNR==NR{for (i=2;i<=NF;i++) a[i,$1]=$i;next}{printf "%s\t",$0; for (i=2;i<=6;i++) printf "%s\t",(a[i,$1]?a[i,$1]:"NA");print ""}' f2 f1
rs1    AA    10 QQ      TT      UU      NA      NA
rs2    BB    20 NA      NA      NA      NA      NA
rs3    CC    30 RR      WW      NA      NA      NA
rs4    DD    40 ZZ      NA      NA      NA      NA
awk'FNR==NR{for(i=2;i试试这个:

awk '
  BEGIN {OFS = "\t"}
  FNR == NR {
    if (NF > 1) {
      if (NF > maxnf) maxnf = NF
      nf[$1] = NF
      a[$1] = $2
      for (i = 3; i <= NF; ++i) a[$1] = a[$1] "\t" $i
    }
    next
  }
  {
    if (NF < 3) {$3 = $2; $2 = " "}
    else         $1 = $1  # ensure fields are separated by tabs
    printf($0)
    n = 1
    if ($1 in a) {n = nf[$1]; printf("\t%s", a[$1])}
    for (i = n; i < maxnf; ++i) printf("\tNA");
    print""
  }
' file2 file1

谢谢。问题是我有很多专栏,这使得这段代码有点不可行。@user2162153更新了我的帖子。谢谢,我想
(I=2;i@Yes,但您确实编写了
我有许多列
,因此您需要根据需要对其进行调整:)谢谢,它适用于上面的示例文件,几乎适用于我的实际文件。有一个问题,我假设
I=3
指的是您要导入的第一列,而不是
中的
“\t”
(I=3;I@user2162153
a[$1]=$2
行保存字段2。然后循环将字段3附加到NF,由制表符分隔。请参阅编辑以将制表符转换为空格。什么不适用于您的实际文件?谢谢。上面的示例中不存在该字段,但如果
文件2
中的索引列没有值,则导入一个空字段,结果会有一个blank字段,然后您有
NA
。例如,如果
file2
中的
rs4
在其他字段中没有任何值,您将有
rs4 DD 40 NA
@user2162153一个小编辑(添加
和&NF>1
)可能会解决此问题。请尝试上面编辑的代码。谢谢,抱歉,还有一个问题。如果
file1
的某些列中有空字段,则这些字段将在输出中被替换,例如,如果是
rs1 10
,而不是
rs1 AA 10
10
则不会保留在输出的第三列中,而是被移动到第二列。
rs1   AA    10    QQ    TT    UU
rs2   BB    20    NA    NA    NA
rs3   CC    30    RR    WW    NA
rs4   DD    40    ZZ    NA    NA