2017-09-24 86 views
1

我有一個看起來像這樣一個文件:的bash:DIFF函數的輸出內容到2列

file1.txt 
rs13339951:45007956:T:C 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576 5353566 

file2.txt 
rs13339951 45007956 
rs2838331 45026728 
rs5647 12335 
rs4687576:ATCFHF 5353566 

更多的描述:

  • 一些在列1中的值是在2個文件之間相同但不是所有的
  • 的column2中值均爲2檔之間相同

我想,以確定2列中列1中的值不同的行。即這些行1和4在我的例子中。我可以用diff file1.txt和file2.txt來做到這一點。

但是,我想獲得像這樣的結束文件(見下文)。的確,我的目標是使用sed替換另一個文件的名稱,以便兩個文件完全匹配。

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 
+0

你有什麼試過?你可以用'awk'或者''join'來完成。 – codeforester

+0

我正在考慮做類似: diff file1.txt file2.txt | grep \^\ <| sed's/< //' > part1.txt diff file1.txt file2.txt | grep \^\> | sed's /> //'> part2.txt 並以某種方式匹配基於位置的2個文件以獲得一個像上面那樣的文件。它看起來很笨拙而乏味。我需要同時爲500多個文件執行此操作,因此一個命令會很好。 – m93

回答

1

AWK非常適合這個

awk 'FNR==NR {a[$2]=$1; next} a[$2]!=$1 {print a[$2] " " $1}' file1 file2 

輸出

rs13339951:45007956:T:C rs13339951 
rs4687576 rs4687576:ATCFHF 

我們傳遞了兩個文件AWK。它會連續傳遞它們。

FNR==NR {.... next} { ... } 

有了這個「絕招」第一個文件執行的第一個動作和第二個文件執行第二動作。

a[$2]=$1 

鍵值查找表。第二列是關鍵的第一列是值。我們在讀取第一個文件的同時構建查找表。

a[$2]!=$1 {print a[$2] " " $1} 

在迭代第二個文件時,將當前第一列與查找表中的值進行比較。如果它們不匹配,則打印所需的輸出。

+0

謝謝!你能否準確解釋這段代碼的每個部分是什麼?我對bash很陌生,所以我不確定你的命令的每個部分都在做什麼 – m93

+0

@ m93更新了我的答案。讓我知道是否還有其他問題。 –

+0

非常感謝,這真的很有幫助! – m93