AWK现场分离器消失

时间:2013-10-04 14:15:19

标签: awk

我尝试在从数据库中删除列后使用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或其他东西替换为单个逗号。

逗号发生了什么?

2 个答案:

答案 0 :(得分:1)

您可以将输出字段分隔符OFS设置为逗号,以便更好地保留输入语法。

答案 1 :(得分:1)

为字段赋值时,awk使用输出字段分隔符OFS重建输入记录。你有两个选择:

  1. 设置FS=OFS=","而不是FS=",",以便使用逗号重建记录,或
  2. 不要为字段赋值,而是使用RE对整个记录进行操作。
  3. 你已经知道如何做“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做同样的事情。