2011-06-18 52 views
6

儘管進行了所有研究,但這並不像我所期望的那樣工作。我必須失去了一些東西......使用Unix JOIN命令合併兩個文件

文件1 ...

# cat file1.csv 
1  123  JohnDoe 
1  456  BobDylan 
1  789  BillyJean 

文件2 ...

# cat file2.csv 
111  123  DaddyDoe 
222  456  DaddyDylan 
666  777  Stranger 
555  789  DaddyJean 
444  888  Stranger 
333  999  Stranger 

我想參加第二場兩者。當我執行一個左外連接並且只包含第一個文件中的字段時,一切都顯得很花哨。

# join -1 2 -2 2 -a 1 -o 1.2 1.3 file1.csv file2.csv 
123 JohnDoe 
456 BobDylan 
789 BillyJean 

但是,只要我從第二個文件中包含一個字段,這一切都是怪人。

# join -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
DaddyDoeoe 
DaddyDylann 
789 BillyJean DaddyJean 

最後一行看起來很完美!與其他人有什麼關係?任何想法?提前致謝!

編輯:這是我的嘗試與實際CSVs。

# cat file1.csv 
1,123,JohnDoe 
1,456,BobDylan 
1,789,BillyJean 

# cat file2.csv 
111,123,DaddyDoe 
222,456,DaddyDylan 
666,777,Stranger 
555,789,DaddyJean 
444,888,Stranger 
333,999,Stranger 

# join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
,DaddyDoeoe 
,DaddyDylann 
789,BillyJean,DaddyJean 
+0

什麼版本的操作系統?並且是否真的用','來擴展每個文件的分隔符? – shellter

+0

-o選項需要加引號,否則可以使用逗號分隔,而不是空格。不知道這是否是問題,但似乎是一個部分問題, – Suroot

+0

@shellter Unix 3.5。它們是製表符分隔的文件。在嘗試排除故障時,我拿出了逗號。 @Suroot我給了這個鏡頭,但它似乎沒有改變任何東西。 – Nate

回答

5

您使用了-a選項。

-a file_number

除了默認的輸出,產生用於在文件file_number每個unpairable線的線。

此外,奇怪的覆蓋行爲表明您已嵌入回車(\r)。我會用cat -v或者一個不會對Windows文件「聰明」的文本編輯器來仔細檢查這些情況。

+0

嗨@geekosaur,是的,這是我的意圖。 – Nate

+0

@Nate:那你爲什麼困惑?你得到你所要求的;與SQL外連接一樣,另一個文件中的字段爲NULL(空)。 – geekosaur

+0

文件之間有三個匹配:123,456,789。應該沒有丟失的數據。不僅如此,前兩個輸出行還將兩個文件中的名稱混合在一起。 – Nate

2

在命令中使用正確的'field'分隔符。

當我改變自己的數據真實CSV,並用

join -t, -1 2 -2 2 -a 1 -o 1.2 1.3 2.3 file1.csv file2.csv 
# ---^^^ 

123,JohnDoe,DaddyDoe 
456,BobDylan,DaddyDylan 
789,BillyJean,DaddyJean 

我希望這有助於。

+0

謝謝@shellter。我這樣做了,但得到了非常相似的結果。我已將代碼添加到我的問題中。 – Nate

-1

如果你正在做這個命令行,爲什麼不使用粘貼? 貼-d,文件1文件2 >>文件3

的-d arugment是分隔符是您使用

+0

可能是因爲'paste'做了完全不同的事情...... – geirha