【问题标题】:AWK: consolidate table, write empty fieldsAWK:合并表,写入空字段
【发布时间】:2018-11-03 20:12:40
【问题描述】:

我有以下三个文件

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


【解决方案1】:

请您尝试关注一下。

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

【讨论】:

  • stdin 中的文件顺序需要颠倒,我用更大的数据集进行了尝试。此外,工作精彩!谢谢!
【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多