我尝试在从数据库中删除列后使用AWK修改长SQL脚本。
我想修改的行:
INSERT INTO `table` (`one`, `two`, `three`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot');
我的AWK脚本:
BEGIN {
FS=","
}
/`table`/ { $3=$8=""; print }
我与之合作:
awk -f script.awk in.sql > out.sql
除了它似乎删除了所有的字段分隔符(逗号)之外,它几乎完成了我想要它做的事情:
INSERT INTO `table` (`one` `two` `four` `five` `six`) VALUES ('alpha' 'bravo' 'delta' 'echo' 'foxtrot');
我希望看到的是双逗号,我需要使用gsub或其他东西替换为单个逗号。
逗号发生了什么?
答案 0 :(得分:1)
您可以将输出字段分隔符OFS
设置为逗号,以便更好地保留输入语法。
答案 1 :(得分:1)
为字段赋值时,awk使用输出字段分隔符OFS重建输入记录。你有两个选择:
FS=OFS=","
而不是FS=","
,以便使用逗号重建记录,或你已经知道如何做“1”,然后你需要删除双OFS来删除空字段,这里是如何使用GNU awk为gensub()做“2”:
$ awk '{print gensub(/(([^,]+,){2})[^,]+,(([^,]+,){4})[^,]+,/,"\\1\\3","")}' file
INSERT INTO `table` (`one`, `two`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'delta', 'echo', 'foxtrot');
请注意,由于您没有对单个字段执行任何操作,因此您无需指定FS或OFS,并且不会重新编译记录,因此您无需删除通常为错误的结果空字段易发
如果您愿意,可以使用sed做同样的事情。