使用cygwin中的粘贴将列添加到csv文件

时间:2014-11-05 20:26:24

标签: bash csv cygwin paste

我正在使用 cygwin 中的csv文件,试图正确使用 命令粘贴无济于事。这是我尝试时得到的一个例子 粘贴文件tmp1和tmp2:

$ cat tmp1
inst,actual,predic,pfraud,plegit
1,0,0,0.298,0.702
2,0,0,0.052,0.948
3,0,1,0.535,0.465
4,0,0,0.157,0.843
5,0,0,0.002,0.998
6,0,0,0.399,0.601
7,0,0,0.325,0.675
8,0,0,0.09,0.91
9,0,0,0.08,0.92

$ cat tmp2
AMOUNT
0.882342
1.032142
0.89484
0.862725
1.001504
1.360017
1.323887
1.287036
1.199779

$ paste -d, tmp1 tmp2
,AMOUNTtual,predic,pfraud,plegit
,0.88234298,0.702
,1.03214252,0.948
,0.89484535,0.465
,0.86272557,0.843
,1.00150402,0.998
,1.36001799,0.601
,1.32388725,0.675
,1.2870369,0.91
,1.1997798,0.92

期望的结果应该是:

inst,actual,predic,pfraud,plegit,AMOUNT
1,0,0,0.298,0.702,0.882342
2,0,0,0.052,0.948,1.032142
3,0,1,0.535,0.465,0.89484
4,0,0,0.157,0.843,0.862725
5,0,0,0.002,0.998,1.001504
6,0,0,0.399,0.601,1.360017
7,0,0,0.325,0.675,1.323887
8,0,0,0.09,0.91,1.287036
9,0,0,0.08,0.92,1.199779

任何人都知道这里发生了什么?

日Thnx!

更新:强调在cygwin中发生了这种情况,而不是在Linux机器上。

更新2 :我已尝试使用其他变体,例如paste -d"," tmp1 tmp2paste -d',' tmp1 tmp2

3 个答案:

答案 0 :(得分:1)

好的,答案非常简单,并在@shellter的评论中给出。

只需用dos2unix更改文件格式就可以解决问题(实际上,只需更改tmp1即可)。似乎没有这个修复,paste并没有完全得到每一行tmp1结束的地方,导致我最初发布的内容。

所以,要解决这个以及任何可能的后续问题,我只需dos2unix编辑每个文件:

dos2unix tmp*
paste -d, tmp1 tmp2 > new_file.csv

希望这可以节省某人未来的时间。

答案 1 :(得分:1)

只是关于您的案例中发生的事情的说明:Windows行结尾由字符\r\n组成,而Linux仅由\n组成。 \n(10)是 LF ,这意味着换行\r(13)是CR - 回车。这些字符的命名解释了为什么你的结果看起来像。

paste从第一个文件的第一行获取了字符。行以\r\n结尾。这意味着\r移动了#34;光标"到行的开头,\n告诉paste切换到第二个文件。因为"光标"现在是在行的开头而不是在结尾,第二个文件中的字符覆盖了以前的字符。

所以paste很好地认识到每一行结束的地方,它也只是解释了字符 CR

答案 2 :(得分:0)

正确的语法是

paste -d "," tmp1 tmp2

这也可以在逗号上没有引号。

结果:

inst,actual,predic,pfraud,plegit,AMOUNT
1,0,0,0.298,0.702,0.882342
2,0,0,0.052,0.948,1.032142
3,0,1,0.535,0.465,0.89484
4,0,0,0.157,0.843,0.862725
5,0,0,0.002,0.998,1.001504
6,0,0,0.399,0.601,1.360017
7,0,0,0.325,0.675,1.323887
8,0,0,0.09,0.91,1.287036
9,0,0,0.08,0.92,1.199779