2017-07-18 58 views
0

我有以下三个文件缺少值:填写从第二或第三文件(bash)的

list1.txt

AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0005 COG1005 
AB0006 COG5621 
AB0007 COG4591 
AB0008 COG1136 
AB0009 COG0071 
AB0010 COG3212 

list2.txt

AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0004 
AB0005 
AB0006 COG5621 
AB0007 COG3127 
AB0008 COG1136 
AB0009 COG0071 
AB0010 COG3212 

list3.txt

AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0004 COG5146 
AB0005 NOG84439 
AB0006 COG5621 
AB0007 COG0577 
AB0008 COG1136 
AB0009 COG0071 
AB0010 NOG218375 

我想用其他列的第2列中的值填充缺失值(来自第一列AB00[01-10]),其中列表1具有最高优先级,列表2最高,列表3最低优先级。 因此所需的输出将是:

AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0004 COG5146 
AB0005 COG1005 
AB0006 COG5621 
AB0007 COG4591 
AB0008 COG1136 
AB0009 COG0071 
AB0010 COG3212 

这意味着列表1应作为基础,如果缺少值,把它从列表2,如果该值也是在列表2失踪,把它从项目list3。

+0

的值被制表符分隔或空格分开吗?你为自己做了什么? – Inian

+0

他们是选项卡分离。我试图寻找它,但我发现的唯一的东西是'comm',它与我想要的相反。我能想象的唯一事情是按照1-2-3的顺序连接列表,使用'awk'删除重复行{if(stored_lines中的$ 1)x = 1;其他打印; stored_lines [$ 1] = 1}''并排序。但是它必须有一个更容易(优先AWK)的解决方案! – rororo

回答

2

以相反的顺序处理文件的优先顺序,优先顺序越高越好。使用NF>1可确保忽略具有缺失值的行。

$ awk 'BEGIN {FS=OFS="\t"} NF > 1 {a[$1] = $2} END {for (i in a) print i, a[i]}' list3.txt list2.txt list1.txt | sort 
AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0004 COG5146 
AB0005 COG1005 
AB0006 COG5621 
AB0007 COG4591 
AB0008 COG1136 
AB0009 COG0071 
AB0010 COG3212 
0

加入 + AWK组合:

join -a2 list1.txt list2.txt | join -a2 - list3.txt | awk '{print $1,$2}' OFS='\t' 

输出:

AB0001 COG0593 
AB0002 COG0592 
AB0003 COG1195 
AB0004 COG5146 
AB0005 COG1005 
AB0006 COG5621 
AB0007 COG4591 
AB0008 COG1136 
AB0009 COG0071 
AB0010 COG3212 
相关问题