AWK:合并表,写空字段

时间:2018-11-03 20:12:40

标签: 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

现在,我编写了合并文件的代码,并在缺少值的情况下在文件1-文件2-文件3的第一列中获取每个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列的所有值,如果这三个文件中的所有值都是空的。我该如何修改我的代码?

2 个答案:

答案 0 :(得分:2)

请您尝试以下。

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

答案 1 :(得分:2)

由于每个文件中的键值相同:

awk '
    { val[$1] = (val[$1]=="" ? $2 : val[$1]) }
    ARGIND==3 { print $1, val[$1] }
' file1 file2 file3
1000001
1000002 COG1943
100001 COG4658
100002 COG4656
100003
100004 COG2878
100005
100006 COG4657
100007 COG2202

上面的代码将GNU awk用于ARGIND,其他awks使用FILENAME==ARGV[3]而不是ARGIND==3