在 bash 中,替换 csv 文件中的换行符,除非位于行尾

问题描述 投票:0回答:2

我有一个巨大的 csv 文件,大约 500Mb。字段分隔符是管道字符 (|)。有些行包含换行符和回车符。我需要删除它们,但我不想删除每行末尾的合法换行符。我尝试过使用 sed 和 tr,如其他问题所示,但最终删除了所有换行符,这不是我想要的。

示例输入(||Yes 行应连接到上一行):

21/06/2016 18:06:32|||||||||||||||||||32 Red|Jrup Vej 6|61069849
||Yes||vals
21/06/2016 18:06:32|||||||||||||||||||101 K|Ser Bevard 110|||No|

我的尝试:

sed -i 's/\r\n//g' myfile.csv

tr -d '\r' < myfile.csv

感谢您的帮助, 乔

bash csv sed
2个回答
3
投票

csv 数据通常具有固定数量的列。

在您的情况下,完整记录似乎有 25 列。基于此,您可以使用此 awk 命令来连接损坏的记录:

awk -F '|' 'NF < 25 {getline s; $0 = $0 s} 1' file

21/06/2016 18:06:32|||||||||||||||||||32 Red|Jrup Vej 6|61069849||Yes||vals
21/06/2016 18:06:32|||||||||||||||||||101 K|Ser Bevard 110|||No|

0
投票

我喜欢@anubhava 的宝石命令。我针对记录被多个换行符打破的情况进行了修改。除非我遗漏了一些东西,否则原件最多只会连接两行,然后从下一行开始。

awk -F '|' '{ while( NF < 25 ) { getline s; $0 = $0 } 1' file
© www.soinside.com 2019 - 2024. All rights reserved.