2011-06-18 32 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