【问题标题】:Replacing newline character in a field in csv file替换csv文件中字段中的换行符
【发布时间】:2015-08-18 20:43:51
【问题描述】:

我有一个有 165 列的 CSV file,但我遇到了问题。 我需要用列中的空格而不是行尾替换 \r\n 字符,因为它是记录分隔符。

输入:

001|Baker St.
London|3|4|7
002|Penny Lane
Liverpool|88|5|7

输出:

001|Baker St. London|3|4|7
002|Penny Lane Liverpool|88|5|7

我正在使用 Windows 脚本,但我愿意使用 UnxTools (gawk, sed, tr) 或任何需要的东西。

【问题讨论】:

  • 请注意,您可以在 cmets 中提供反馈,并最终接受答案。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何问题,请参阅Help Center > Asking
  • 抱歉耽搁了。首先,感谢您的回答,但我认为我没有正确解释。 \r\n 是回车和换行符,而不是字面意义上的 \r\n。
  • 好的,我明白了:你想加入多行字段。检查我更新的答案。
  • 它就像我的 165 字段 CSV 的魅力。谢谢!

标签: csv awk sed tr


【解决方案1】:

因此您需要对多行字段进行分组。在这种情况下,让我们手动存储字符串,直到它“足够大”,即,直到它有足够的字段来知道记录是完整的:

awk -F"|" -v fields=5 '{f+=NF; str=(str?str OFS:"") $0}
                       f>=fields{print str; str=""; f=0}' file

使用-v fields=5,我们指示正确的行应包含多少个字段。然后,我们继续将数据存储在str 变量中,直到它至少有fields 字段。

另请注意,您正在使用 Windows 文件。要在 UNIX 中正常工作,首先使用 dos2unix file 将其转换为这种格式。这会将\r\n 转换为\n

测试

$ awk -F"|" -v fields=5 '{f+=NF; str=(str?str OFS:"") $0} f>=fields{print str; str=""; f=0}' file
001|Baker St. London|3|4|7
002|Penny Lane Liverpool|88|5|7

(旧版本,当您看起来需要删除文字时 \r\n

只要确保在\r\n 之后出现某些内容,就不会匹配行尾:

$ sed -r 's/\\r\\n(.)/ \1/g' file
001|Baker St. London|3|4|7\r\n
002|Penny Lane Liverpool|88|5|7\r\n

这会查找 \r\n 以及其他内容,并在空格后打印出其他内容。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 2012-12-12
    • 2016-08-27
    • 2021-11-20
    • 2015-04-06
    • 2018-11-17
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多