在Bash中加入两个CSV文件无法按预期工作

时间:2017-05-15 10:18:03

标签: bash shell join

我有以下文件:

file1.csv

Name,Age,Roll
Anu,21,1
Subi,18,2
Blah,10,3

file2.csv

Fruit,Color,Roll
Mango,Orange,1
Mango,Blue,1
Apple,Black,3

我想以这样的方式加入这两个文件:

Name,Age,Roll,Fruit,Color
Anu,21,1,Mango,Orange
Anu,21,1,Mango,Blue
Subi,18,2,,
Blah,10,3,Apple,Black

我运行了以下命令:
join -t, -a1 -13 -23 -o 1.1,1.2,1.3,2.1,2.2 file1.csv file2.csv

这是我得到的输出:

,Fruit,Colorl 
,Mango,Orange
,Mango,Blue
,,bi,18,2
Blah,10,3,Apple,Black

这不是我要求的输出(实际上,我甚至不知道这个输出是怎么来的),所以我再试一次:
join -t, -a1 -13 -23 hi.csv hi2.csv

我得到的输出:

,Name,Age,Fruit,Color
,Anu,21,Mango,Orange
,Anu,21,Mango,Blue
Subi,18,2
3,Blah,10,Apple,Black

此时我很无能为力。我在普通join文件上尝试了.txt,但它们运行得非常好。我还提到了有关stackoverflow上类似问题的各种其他解决方案,但都没有。请帮忙。

注意:我使用的是Mac。

1 个答案:

答案 0 :(得分:1)

似乎 123 给出了必要的提示。

要检查这一点,我在

中准备了您的示例文件
  • Unix风格:行结尾\nfile1.csvfile2.csv
  • Mac风格:行结尾\rmacfile1.csvmacfile2.csv
  • DOS / Windows样式:行结尾\r\ndosfile1.csvdosfile2.csv)。

我的测试会话(在cygwin的bash中):

$ join -t, -a1 -13 -23 file1.csv file2.csv
Roll,Name,Age,Fruit,Color
1,Anu,21,Mango,Orange
1,Anu,21,Mango,Blue
2,Subi,18
3,Blah,10,Apple,Black

$ hexdump -c file1.csv 
0000000   N   a   m   e   ,   A   g   e   ,   R   o   l   l  \n   A   n
0000010   u   ,   2   1   ,   1  \n   S   u   b   i   ,   1   8   ,   2
0000020  \n   B   l   a   h   ,   1   0   ,   3  \n                    
000002b

$ cat file1.csv | tr "\n" "\r" >macfile1.csv

$ cat file2.csv | tr "\n" "\r" >macfile2.csv

$ hexdump -c macfile1.csv 
0000000   N   a   m   e   ,   A   g   e   ,   R   o   l   l  \r   A   n
0000010   u   ,   2   1   ,   1  \r   S   u   b   i   ,   1   8   ,   2
0000020  \r   B   l   a   h   ,   1   0   ,   3  \r                    
000002b

$ cat file1.csv | sed $'s/$/\r/' >dosfile1.csv

$ cat file2.csv | sed $'s/$/\r/' >dosfile2.csv

$ hexdump -c dosfile1.csv 
0000000   N   a   m   e   ,   A   g   e   ,   R   o   l   l  \r  \n   A
0000010   n   u   ,   2   1   ,   1  \r  \n   S   u   b   i   ,   1   8
0000020   ,   2  \r  \n   B   l   a   h   ,   1   0   ,   3  \r  \n    
000002f

$ join -t, -a1 -13 -23 file1.csv file2.csv
Roll,Name,Age,Fruit,Color
1,Anu,21,Mango,Orange
1,Anu,21,Mango,Blue
2,Subi,18
3,Blah,10,Apple,Black

$ join -t, -a1 -13 -23 macfile1.csv macfile2.csv
Blah,10,3Age,21,1

$ join -t, -a1 -13 -23 dosfile1.csv dosfile2.csv
,Name,Age,Fruit,Color
,Anu,21,Mango,Orange
,Anu,21,Mango,Blue
,Subi,18
,Blah,10,Apple,Black

$

...并应用推荐的 123

$ cat dosfile1.csv | sed $'s/\r//' >dosfile1.fixed.csv

$ cat dosfile2.csv | sed $'s/\r//' >dosfile2.fixed.csv

$ join -t, -a1 -13 -23 dosfile1.fixed.csv dosfile2.fixed.csv
Roll,Name,Age,Fruit,Color
1,Anu,21,Mango,Orange
1,Anu,21,Mango,Blue
2,Subi,18
3,Blah,10,Apple,Black

$

......可以实现预期的输出。

希望它在Mac上的工作方式相同。