将SQL插入脚本转换为CSV格式

jan*_*cki 5 sql csv awk sed export-to-csv

我正在寻找一个awk命令或类似工具,将标准格式良好的SQL插入脚本转换为csv文件.
按标准我的意思是任何地方都没有数据库供应商特定的东西
格式良好我指的是sql脚本的每一行都有一个完整的列设置要插入的情况,即使有NULL.插入的字段顺序也是相同的.
示例输入SQL脚本:

INSERT INTO tbl VALUES (1, 'asd', 923123123, 'zx');
INSERT INTO tbl VALUES (1, NULL, 923123123, 'zxz');
INSERT INTO tbl VALUES (3, 'asd3', 923123123, NULL);
Run Code Online (Sandbox Code Playgroud)

可选:

INSERT INTO tbl (colA, colB, colC, colD) VALUES (1, 'asd', 923123123, 'zx');
Run Code Online (Sandbox Code Playgroud)

预期输出应该是csv文件:

1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
Run Code Online (Sandbox Code Playgroud)

寻找性能高效的解决方案.

Cyr*_*rus 5

尝试使用GNU grep和sed:

grep -oP '\(\K[^)]*(?=\);)' file | sed 's/NULL//g;s/ //g'
Run Code Online (Sandbox Code Playgroud)

所有四条线的输出:

1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
1,'asd',923123123,'zx'

或仅与GNU sed:

sed 's/.*(\([^)]*\));/\1/;s/NULL//g;s/ //g' file
Run Code Online (Sandbox Code Playgroud)

所有四条线的输出:

1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
1,'asd',923123123,'zx'


Ed *_*ton 5

$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,'asd',923123123,'zx'
1,,923123123,'zxz'
3,'asd3',923123123,
Run Code Online (Sandbox Code Playgroud)

我建议您使用此输入测试所有可能的解决方案:

$ cat file
INSERT INTO tbl VALUES (1, NULL, 923123123, 'foo NULL bar');

$ awk -F' *[(),]+ *' -v OFS=, '{for (i=2;i<NF;i++) printf "%s%s", ($i=="NULL"?"":$i), (i<(NF-1)?OFS:ORS)}' file
1,,923123123,'foo NULL bar'
Run Code Online (Sandbox Code Playgroud)

确保字符串NULL和空白字符作为文字字符串的一部分出现时不会被删除.