2014-03-31 43 views
3

我想加入三個文件。我大致得到了如何去做。我需要加入2,然後加入到第三個。我的問題是我非常確定我需要使用-j和-o,但我不知道如何使用它們。這些是我需要加入的三個文件可以有人幫助我嗎?用Unix加入文件

LN.txt 
Jones:John 
Kelly:Mary 
Adams:Betty 
Reich:Richard 

PH.txt 
Jones:905-555-1212 
Kelly:416-555-2424 
Adams:416-555-5757 
Reich:905-555-8989 

AD.txt 
Jones:Toronto 
Kelly:Calgary 
Adams:Calgary 
Reich:Toronto 

顯然我只需要使用他們的姓氏一次。

+1

哪個殼?這很重要,因爲Bash有其他shell不支持的[進程替換](http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution),這使得命令更容易執行正常工作。 –

回答

4

試試這個,您可以更改文件的順序,以滿足您的需求:

join -t':' LN.txt PH.txt | join -t':' - AD.txt > outputFile.txt 

正如@Jonathan萊弗勒認爲,加入以下爲未排序文件在bash工作:

join -t':' <(sort LN.txt) <(sort PH.txt) | join -t':' - <(sort AD.txt) 
+0

「加入」的輸入必須在連接字段上進行排序,至少爲了可靠的操作。 –

+0

同意,我會補充說。謝謝! – Amit

+1

使用給定的數據,每個文件中連接列的順序相同,上面的「連接」序列可以工作(至少在Mac OS X 10.9.2上)。用Bash,'join -t:<(sort LN.txt)<(sort PH.txt)| join -t: - <(sort AD.txt)'是可靠的 - 這就是我在發佈此評論之前添加到答案中的內容。 –

1

Amit使用join有很好的解決方案。這是一個參考,您可以使用awk作爲您的工具選擇。

$ awk -F: '{ 
    names[$1] = ((names[$1]) ? names[$1] : "")FS $2 
} 
END { 
    for(n in names) 
     print n names[n] 
}' LN.txt PH.txt AD.txt 
Jones:John:905-555-1212:Toronto 
Kelly:Mary:416-555-2424:Calgary 
Adams:Betty:416-555-5757:Calgary 
Reich:Richard:905-555-8989:Toronto