基于引号处理逗号的sed以及多引号内的逗号数据

时间:2018-06-01 04:06:22

标签: linux shell unix awk sed

我的数据如下

123,"john,test",John"test,""john"",345

以上需要按照以下方式进行拆分,

123

"john,test"

John"test

""john""

345

我尝试使用sed在分割时在引号内处理逗号但是对于多个双引号内的数据未正确显示。而且两者之间也有双引号的数据也没有得到处理。我尝试使用awk但无法使用fpat功能,因为我们有旧版本的awk。

你可以帮助解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

sed用于单个行上的简单替换,即全部。对于其他任何问题,例如你的问题,你应该使用awk。请参阅What's the most robust way to efficiently parse CSV using awk?了解如何使用任何awk稳健地处理CSV,即使字段包含换行符但是您遇到特定问题 - 您说您不能使用FPAT但FPAT只是一段时间的GNU简写(匹配) ())在任何awk循环,所以如果你不能这样做:

$ awk -v FPAT='[^,]+|"[^"]+"' '{for (i=1; i<=NF;i++) print i, "<" $i ">"}' file
1 <123>
2 <"john,test">
3 <John"test>
4 <""john"">
5 <345>

然后改为:

$ awk '{ while ( match($0,/[^,]+|"[^"]+"/) ) { print ++i, "<" substr($0,RSTART,RLENGTH) ">"; $0=substr($0,RSTART+RLENGTH) } }' file
1 <123>
2 <"john,test">
3 <John"test>
4 <""john"">
5 <345>

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/([^",]*("[^"]*"[^",]*)*),/\1\n/g' file

将所有未被双引号括起来的逗号替换为换行符。

更深入:分组零个或多个不包含双引号或逗号的字符,后跟零个或多个双引号组,后跟零个或多个非双引号字符(可能是逗号),后跟双引号后跟零个或多个不包含双引号的字符,后跟逗号,并用换行符替换最后一个逗号。在整个文件中全局执行此操作。

现在如果引用双引号或逗号......