本周一直在linux下面处理一些CSV文件,因为是在linux中处理windows的CSV。所有碰到这两个操作系统对“回车”的不同定义。
linux中直接用 \n 定义回车
windows中用的是 \r\n 来定义回车。
这使得处理脚本的时候碰到个很头疼的问题。
在CSV文件中对回车还有区分:硬回车和软回车。硬回车就是我们平时直接说的回车。软回车,是在同一个单元格中实现的回车。这要在编辑CSV的时候强制实行才行(同时按下Alt + Enter)。
现在来描述一下问题:
因为CSV中有同时有软硬回车的出现。所以一行中会出现多个\n。但这些\n在windows中都不认为是换行符。因为windows认为的换行符是\r\n。可是在linux中就不一样了,linux认为\n是一行的结束。所以在windows下的一行,到linux中就变成了多行了。
为了处理这个问题。我的步骤如下:
1,tr -d '\n' < PIPESEG_F.CSV.4 > PIPESEG_F.4.no_n --去掉文件中所有的\n,并保存到PIPESEG_F.4.no_n,这样PIPESEG_F.4.no_n中只有\r字符,没有\n.
2,echo '\n' > PIPESEG_F.4.no_n。追加\n到PIPESEG_F.4.no_n中,以便下面的sed命令执行。
3,sed 's/\r/\r\n/g' PIPESEG_F.4.no_n > PIPESEG_F.4_rn。用\r\n,替换所有的\r。此时PIPESEG_F.4_rn的行数要比源文件多一行,因为多了一个\n
4,sed '$d' PIPESEG_F.4_rn > PIPESEG_F.4_rn.res 删除文件结尾的一行,实际上这行只有一个\n符合而已,没有实际的数据.完成处理。