【问题标题】:Use Unix JOIN command to merge two files使用 Unix JOIN 命令合并两个文件
【发布时间】:2011-06-18 01:41:43
【问题描述】:

尽管进行了所有研究,但这并没有像我预期的那样工作。我一定是错过了什么……

文件 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

【问题讨论】:

  • 您使用的是什么版本的操作系统?根据文件扩展名,列是否真的用“,”分隔?
  • -o 选项必须是引号,或者如果空格可以使用逗号分隔。不确定这是否是问题,但似乎是部分问题,
  • @shellter Unix 3.5。它们是制表符分隔的文件。我在尝试排除故障时去掉了逗号。 @Suroot 我试了一下,但它似乎没有改变任何东西。

标签: unix join


【解决方案1】:

您使用了-a 选项。

-afile_number

除了默认输出之外,为文件 file_number 中每个不可配对的行生成一行。

此外,奇怪的覆盖行为表明您嵌入了回车符 (\r)。我会使用 cat -v 或不会尝试对 Windows 文件“智能”的文本编辑器仔细检查这些文件。

【讨论】:

  • 嗨@geekosaur,是的,这就是我想要的。
  • @Nate:那你为什么感到困惑?你得到了你所要求的;与 SQL 外连接一样,来自另一个文件的字段为 NULL(空)。
  • 文件之间有3个匹配:123、456、789。应该没有丢失的数据。不仅如此,前两个输出行还包含两个文件的名称混合在一起。
  • 啊,我明白了。你有混合换行符的行。扩大响应。
  • @geekosuar,你是救生员。这是回车。我将我的 FTP 应用程序从二进制转换为 ASCII 传输,现在我很成功。谢谢!
【解决方案2】:

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

当我将您的数据更改为真正的 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

我希望这会有所帮助。

【讨论】:

  • 谢谢@shellter。我这样做了,但得到了非常相似的结果。我已将代码添加到我的问题中。
【解决方案3】:

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

-d 参数是分隔符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-20
    • 2015-05-10
    • 2012-12-17
    • 2020-08-20
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多