我有一个CSV file
165列,我有一个问题.我需要\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)
或不需要它.
因此,您需要对多行字段进行分组.在这种情况下,让我们手动存储字符串直到它"足够大",也就是说,直到它有足够的字段来知道记录完成:
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
另外一件事,并在空间后打印出其他东西.