2017-07-18 59 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 
相關問題