2014-05-18 57 views
1

線對準他們,我有兩個文件: 第一個擁有所有序列的名字是這樣的:的Unix - 比較兩個文件,並通過線

comp10604_c0_seq1 
comp108_c0_seq1 
comp11450_c0_seq1 
comp11655_c0_seq1 
comp11804_c0_seq1 
comp13465_c0_seq1 
comp13695_c0_seq1 

第二個有關於這些序列的信息,但它缺少某些信息這樣的序列:

comp10604_c0_seq1 AB491617.1 
comp11450_c0_seq1 AM920464.1 
comp11655_c0_seq1 HQ865168.1 
comp11804_c0_seq1 KC900889.1 
comp13465_c0_seq1 HM590421.1 
comp13695_c0_seq1 GU474930.1 

我想一個文件,其中替換換行符和插入序列的名字,如果沒有信息的順序是這樣的:

comp10604_c0_seq1 AB491617.1 
comp108_c0_seq1 NAN 
comp11450_c0_seq1 AM920464.1 
comp11655_c0_seq1 HQ865168.1 
comp11804_c0_seq1 KC900889.1 
comp13465_c0_seq1 HM590421.1 
comp13695_c0_seq1 GU474930.1 

謝謝您的幫助

回答

4

你輸入時,出現排序。你可以使用join;失蹤的字段指定值:

join -e "NaN" -a1 -a2 -o 1.1 2.2 first second 

爲您的樣品輸入,它會產生:

comp10604_c0_seq1 AB491617.1 
comp108_c0_seq1 NaN 
comp11450_c0_seq1 AM920464.1 
comp11655_c0_seq1 HQ865168.1 
comp11804_c0_seq1 KC900889.1 
comp13465_c0_seq1 HM590421.1 
comp13695_c0_seq1 GU474930.1 

管道輸出到column -t,如果你喜歡它對齊。

+0

如果我有幾列信息文件,我想在同一時間加入? – Muramasa

+1

@muramasa一次連接2個文件,將結果傳遞給另一個連接,該連接將前一個連接的STDOUT作爲輸入,將第三個文件作爲另一個輸入。更多信息請參閱info join。 – devnull

1

如果您的文件已排序,而您希望只比較一列,則devnull有正確的答案。

下面是使用awk另一種方式:

awk 'NR==FNR{seq[$1]=$2;next}{print $1,($1 in seq?seq[$1]:"NaN")}' file2 file1 
comp10604_c0_seq1 AB491617.1 
comp108_c0_seq1 NaN 
comp11450_c0_seq1 AM920464.1 
comp11655_c0_seq1 HQ865168.1 
comp11804_c0_seq1 KC900889.1 
comp13465_c0_seq1 HM590421.1 
comp13695_c0_seq1 GU474930.1 

我們遍歷file2的第一存儲列2爲值在列1索引的數組。對於file1,我們打印第1列並檢查數組中是否存在該鍵。如果是這樣,我們打印下一個值,我們打印NaN