【问题标题】:awk ignore delimiter inside single quote within a parenthesisawk 忽略括号内单引号内的分隔符
【发布时间】:2018-06-30 13:43:54
【问题描述】:

我在 csv 中有一组数据,如下所示:

 Given Data:
 (12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye),
 (13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

我想将给定的数据打印到从 ( until ) 开始的 2 行中并忽略分隔符 , 和 () 在 ' ' 字段内。

如何在 linux 中使用 awk 或 sed 做到这一点?

预期结果如下:

 Expected Result: 
 row 1 = 12,'hello','this girl,is lovely(adorable actually)',goodbye
 row 2 = 13,'hello','this fruit,is super tasty (sweet actually)',goodbye

更新: 我刚刚注意到两行之间有一个逗号。那么如何使用 , after ) 和 before (?

将它分成 2 行

【问题讨论】:

  • 你试过什么?我们这里的大多数人都很乐意帮助你提高你的手艺,但作为短期无偿编程人员不太乐意。在MCVE 中向我们展示您迄今为止的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。
  • @ghoti 我尝试使用 awk -F"[()]" '{print $2}' test.csv 但它不起作用,因为这些行在我的 test.csv 中
  • Derek,我希望看到您尝试解决问题,而不仅仅是评论中的一些代码。我想帮助您理解解决方案,而不是让您克服编程障碍而不帮助您提高技能。将您尝试过的问题添加到您的问题中,描述您认为解决整体问题需要遵循的过程,并告诉我们您在执行该策略时遇到的问题。

标签: awk sed delimiter quote


【解决方案1】:

您可以使用以下awk 命令来实现您的目标:

awk -i.bak '{str=substr($0,2,length($0)-2); gsub("\\\\r ?|\\\\n ?","",str); print "row "NR" = "str;}' file.in

已根据您的输入进行测试:

解释:

  • -i.bak 将备份您的文件并
  • {str=substr($0,2,length($0)-2); gsub("\\\\r ?|\\\\n ?","",str); print "row "NR" = "str;} 将首先删除字符串的第一个和最后一个括号,然后删除 \r,\n 并以您想要的格式打印它
  • 如果您有标题NR>1 -> 'NR>1{str=substr($0,2,length($0)-2); gsub("\\\\r ?|\\\\n ?","",str); print "row "NR" = "str;}',您可能需要在{...} 之前添加以下条件

根据您的要求的变化,我已经调整了 awk 命令,以便能够将您的 , 作为记录分隔符(行分隔符)考虑在内

awk -i.bak 'BEGIN{RS=",\n|\n"}{str=substr($0,2,length($0)-2); gsub("\\\\r ?|\\\\n ?","",str); print "row "NR" = "str;}' file.in

BEGIN{RS=",\n|\n"} 定义了你的行分隔符约束

【讨论】:

  • 我刚刚注意到另一个问题,两个数据之间有一个逗号。那我该如何使用数据作为分隔符呢?
  • 我的输出与您在帖子中描述的完全一样!那么你想要的输出是什么?
  • 如果您看到我的更新,我在 2 ( ) 值之间添加了一个逗号。因此,代替换行符作为行分隔符,逗号成为行分隔符
  • 我已经修改了我的答案!让我知道这是否对您有帮助。顺便说一句,逗号后面有回车对吗?
  • 感谢您的回答,现在确实有帮助..谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2017-04-02
  • 2015-06-20
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多