替换csv文件中字段中的换行符

时间:2015-06-04 09:44:09

标签: csv awk sed tr

我有一个包含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)或其他任何需要的内容。

1 个答案:

答案 0 :(得分:5)

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

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加上另一个东西,并在空格后打印其他东西。