首页 > 解决方案 > AWK:合并表,写入空字段

问题描述

我有以下三个文件

file1:
1000001
1000002
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007

file2:
1000001
1000002 COG1943
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007

file3:
1000001
1000002 NOG04887
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007  COG2202

现在我编写了合并文件的代码,如果缺少值,则按 file1 - file2 - file3 的顺序在第一列中获取每个 id 的值。

awk 'BEGIN {FS=OFS="\t"} NF > 1 {a[$1] = $2} END {for (i in a) print i, a[i]}' file3 file2 file1

这给了我以下输出:

1000002 COG1943
100001  COG4658
100002  COG4656
100004  COG2878
100006  COG4657
100007  COG2202

这是正确的,但我想列出第 1 列的所有值,如果所有三个文件中的值都是空的。我需要如何修改我的代码?

标签: awk

解决方案


请您尝试以下操作。

awk '
FNR==1{
  count++
}
count==1{
  a[$1]=$2
  next
}
count==2{
  if(($1 in a) && a[$1]==""){
     a[$1]=$2
  }
  if(!($1 in a)){
     a[$1]=$2
  }
  next
}
count==3{
  print $1,a[$1]?a[$1]:$2
}
' OFS="\t"  Input_file1  Input_file2  Input_file3

输出如下。

1000001
1000002 COG1943
100001  COG4658
100002  COG4656
100003
100004  COG2878
100005
100006  COG4657
100007  COG2202

推荐阅读