【问题标题】:Removing multi-line string from a filed in a file从文件中的文件中删除多行字符串
【发布时间】: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

我尝试了以下方法:

  1. 请求源系统在每行末尾添加一个标识“qqqqzzzz”

  2. 尝试将所有新行替换为空格,然后再次将所有 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

尝试替换引用文本hereherehere的解决方案

尝试使用命令后更新:

$ 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' 的方法,请指导我们如何在没有它的情况下继续尝试实现它
  • 您已经接受了这个问题的答案。如果您有新问题,请单独发布该新问题。

标签: linux bash csv awk sed


【解决方案1】:

使用 GNU awk:

$ awk 'BEGIN{RS=",\"qqqqzzzz\" ?\r?\n"}{$1=$1}1' file
1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4
5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7

用 dos 和 unix 行尾测试。关键是使用标识符和相关的额外字符(逗号、条件空格和行尾字符)作为记录分隔符(RS),问题是在第一个标识符之后有一个空格,但在第二个之后没有。

【讨论】:

  • 输出:1,"Bob Smith 531 Pennsylvania Avenue Washington, DC",3,4,"qqqqzzzz" 5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7
  • 一行而不是两行
  • 我在行尾前加了一个空格。这会有帮助吗?
  • 现在最后一行显示为 "5,"Bob Smith 531 Pennsylvania Avenue Washington, DC",6,7,"qqqqzzzz""
  • 设置空间条件,现在怎么样?
猜你喜欢
  • 2022-12-18
  • 2021-08-09
  • 1970-01-01
  • 2014-12-19
  • 2018-10-18
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多