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

Replacing newline character in a field in csv file

我有一个包含 165 列的 CSV file,但我遇到了问题。 我需要用列中的空白 space 替换 \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) 或任何需要的脚本。

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

awk -F"|" -v fields=5 '{f+=NF; str=(str?str OFS:"") [=10=]}
                       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:"") [=11=]} 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(.)/ /g' file
001|Baker St. London|3|4|7\r\n
002|Penny Lane Liverpool|88|5|7\r\n

这会查找 \r\n 加上另一件事,并在 space 之后打印另一件事。