【发布时间】:2018-07-06 22:40:04
【问题描述】:
我有一个如下的 csv 文件,由源系统发送,除了添加列之外,它们没有任何处理机制:
1,"Bob Smith
531 Pennsylvania Avenue
Washington, DC",3,4,"qqqqzzzz"
5,"Bob Smith
531 Pennsylvania Avenue
Washington, DC",6,7,"qqqqzzzz"
预期输出:
1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4
5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7
我尝试了以下方法:
请求源系统在每行末尾添加一个标识“qqqqzzzz”
尝试将所有新行替换为空格,然后再次将所有 qqqqzzzz 替换为新行
但是最后一次替换 qqqqzzzz 会导致换行换成引号,如下所示:
1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4,""
5,"Bob Smith
sed '/^$/d' all.csv|tr '\n' ' '|sed 's/qqqqzzzz/\n/g' >results.csv
尝试使用命令后更新:
$ sed 'N;N;s/\n//g;s/,"qqqqzzzz"$//' quotetest.csv
1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4,"qqqqzzzz"
5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7
【问题讨论】:
-
不要在代码部分插入
<br>,每行缩进4个空格 -
好的,下次会处理的。
-
sed 用于在单个行上进行简单替换,仅此而已。对于任何更复杂的事情,包括涉及多行记录的任何事情,您甚至不应该考虑使用 sed 作为 awk 解决方案将始终更健壮、更高效、更简单、更清晰、更容易增强等......你可能没有需要添加该 qqqqzzzz 字符串,并且有一个更简单的解决方案,仅基于
\r\n行尾或忽略引号内的换行符。 -
@EdMorton:由于我不知道我要求添加 'qqqqzzzz' 的方法,请指导我们如何在没有它的情况下继续尝试实现它
-
您已经接受了这个问题的答案。如果您有新问题,请单独发布该新问题。