awk - 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 '
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
推荐阅读
- http-error - 无法读取站点地图:Google Search Console
- c# - SQL删除不在列表中的项目
- flutter - 我如何在颤动中显示从 api 获取的数据
- sql - 使用 SQL Server 尝试根据另一个搜索的结果查找结果
- ruby-on-rails - 将日期选择器添加到 Ruby on Rails 6 项目的最原生方式是什么?
- python - Python Selenium - 在标签后查找输入字段
- r - 用新值填充字符和数值
- python-3.x - 子类化 QAbstractItemModel 以将嵌套的 dict 数据显示为树
- javascript - JavaScript:带有回调的 Try-Catch-Finally (next())
- python-3.x - 2D 列表 - Python - 奇怪的循环行为(被告知时不会停止)