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

dig*_*ine 0 csv awk sed tr

我有一个CSV file165列,我有一个问题.我需要\r\n用列中的空格替换字符,而不是从行尾替换,因为它是记录分隔符.

输入:

001|Baker St.
London|3|4|7
002|Penny Lane
Liverpool|88|5|7
Run Code Online (Sandbox Code Playgroud)

输出:

001|Baker St. London|3|4|7
002|Penny Lane Liverpool|88|5|7
Run Code Online (Sandbox Code Playgroud)

我正在使用Windows脚本,但我愿意使用UnxTools (gawk, sed, tr)或不需要它.

fed*_*qui 5

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

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

随着-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
Run Code Online (Sandbox Code Playgroud)

(旧版本,当你看起来需要删除文字时\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
Run Code Online (Sandbox Code Playgroud)

这样可以寻找\r\n另外一件事,并在空间后打印出其他东西.