awk 忽略括号内单引号内的定界符

awk ignore delimiter inside single quote within a parenthesis

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

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

我想将给定的数据打印成从 ( till ) 开始的 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 (?

将它分成两行

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

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

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

解释:

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

根据您的要求更改,我调整了 awk 命令,以便能够将您的 , 作为记录分隔符(行分隔符)

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

其中 BEGIN{RS=",\n|\n"} 定义行分隔符约束