AWK场分离器消失

AWK场分离器消失,awk,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 -

我试图在从数据库中删除一列后使用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
这几乎完成了我希望它完成的任务,只是它似乎删除了所有字段分隔符(逗号):

我希望看到的是一个双逗号,我需要使用gsub或其他东西用一个逗号来代替


逗号发生了什么情况?

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

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

  • 设置
    FS=OFS=“,”
    而不是仅设置
    FS=“,”
    ,以便使用逗号重建记录,或
  • 不要给字段赋值,而是使用REs对整个记录进行操作
  • 您已经知道如何执行“1”,然后需要剥离两个OFSs以删除空字段,下面是如何使用GNU awk for gensub()执行“2”:

    请注意,由于您没有对单个字段执行任何操作,因此不需要指定FS或OFS,记录也不会重新编译,因此不需要删除生成的空字段,因为空字段往往容易出错

    如果愿意,您可以对sed执行相同的操作

    INSERT INTO `table` (`one`  `two`   `four`  `five`  `six`) VALUES ('alpha'  'bravo'   'delta'  'echo'  'foxtrot');
    
    $ awk '{print gensub(/(([^,]+,){2})[^,]+,(([^,]+,){4})[^,]+,/,"\\1\\3","")}' file
    INSERT INTO `table` (`one`, `two`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'delta', 'echo', 'foxtrot');