如何使用awk分隔行

如何使用awk分隔行

如何在 csv 文件中分隔行如下:

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

下面作为 2 个不同的行:

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

我尝试使用:

awk -F"[()]" '{print $2}' test.csv 

但它不起作用并且丢失了几行。

该数据实际上是一个 SQL 查询,我需要提取数据并使用 ) 和之前 ( 作为行分隔符之后的逗号将其转换为不同的行

答案1

使用 GNU sed(并且您的示例输入保存在名为 的文件中./input):

$ sed -e 's/),(/)\n(/g' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

这会将 every 中的逗号更改),(为换行符。

警告:如果该字符序列出现在您的实际数据中,它也会在那里发生更改。

您可以在 中执行相同的操作awk,但与使用相比几乎没有优势sed

$ awk 'gsub(/\),\(/,")\n(",$0)' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

除非您要对需要awk功能的输入行进行进一步处理,否则只需使用sed.

答案2

这个 awk 命令可以做你想做的事:

awk -F '),' '{ print $1")" "\n" $2}' source.csv

结果:

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

答案3

cat test.csv | tr -d "()" | sed 's/goodbye/goodbye\n/g'

  • sed 翻译字符串再见进入换行符(\n)。您可以使用sed 's/goodbye/\n/g'以下命令排除再见“G”是对所有行进行此操作,而不仅仅是第一个匹配项。
  • tr可以选择删除括号(您可以使用 tr 将它们转换为其他内容而不删除它们)

答案4

在 python 中尝试过

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

#!/usr/bin/python
import re
b=a.split("),")
for i in range(0,len(b),1):
    if i == 0:
        d=")"
        print b[i]+d
    else:
        print b[i]

输出

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

相关内容