我正在使用 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 tmp2
,paste -d',' tmp1 tmp2
。
答案 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