使用Unix JOIN命令合并两个文件

使用Unix JOIN命令合并两个文件,unix,join,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 DaddyJea

尽管进行了大量研究,但这并不像我预期的那样有效。我一定错过了什么

文件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
最后一行看起来很完美!其他人怎么了?有什么想法吗?提前谢谢

编辑:这是我对实际CSV的尝试

# 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

您使用了
-a
选项

-文件编号

除了默认输出外,为文件\u编号中的每个不成对行生成一行


此外,奇数覆盖行为表明您具有嵌入的回车符(
\r
)。我会使用
cat-v
或一个不想对Windows文件“聪明”的文本编辑器仔细检查这些文件。

在命令中使用正确的“字段”分隔符

当我将您的数据更改为真正的csv并使用

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


我希望这有帮助。

如果您正在执行此命令行,为什么不使用粘贴? 粘贴-d,文件1文件2>>文件3


-d分隔符是分隔符

您使用的是什么版本的操作系统?根据文件扩展名,列是否真的用“,”分隔?-o选项需要引号,或者如果是空白,可以使用逗号分隔。不确定这是否是问题所在,但似乎是部分问题,@shelleter Unix 3.5。它们是以制表符分隔的文件。我在尝试排除故障时去掉了逗号@苏鲁特我试了一下,但似乎没有改变任何事情。谢谢@Shelleter。我这样做了,但得到了非常相似的结果。我已经在我的问题中添加了代码。嗨@geekosaur,是的,这就是我想要的。@Nate:那你为什么感到困惑?你得到了你想要的;与SQL外部联接一样,另一个文件中的字段为NULL(空)。应该没有丢失的数据。不仅如此,前两个输出行还将两个文件的名称混合在一起。啊,我知道了。你有混合换行的行。扩展响应。@geekosuar,你是个救生员。是马车回来的时候。我把我的FTP应用程序从二进制转换为ASCII传输,现在我是黄金。谢谢
123,JohnDoe,DaddyDoe
456,BobDylan,DaddyDylan
789,BillyJean,DaddyJean