如何在 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)