【问题标题】:In bash, replace newline in csv files, except when at line's end在 bash 中,替换 csv 文件中的换行符,除非在行尾
【发布时间】:2017-06-24 21:33:59
【问题描述】:

我有一个巨大的 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


【解决方案1】:

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|

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2016-04-28
    • 2015-08-18
    • 1970-01-01
    • 2012-12-12
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多