2013-10-04 83 views
3

我试图在从数据库中删除列后使用AWK修改长SQL脚本。AWK字段分隔符正在消失

我想该行修改:

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或其他东西来替换单个逗号。

逗号发生了什么?

回答

1

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

1

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

  1. FS=OFS=",",而不是仅仅FS=","这样一条记录被使用逗号重建或
  2. 不要赋值给一个领域,而是使用资源来对整个记录进行操作。

你已经知道该怎么做“1”,而随后你需要剥离双OFS的去除空场,这里是如何做到“2”使用GNU AWK的gensub():

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

请注意,由于您没有对单个字段进行任何操作,因此您无需指定FS或OFS,并且记录也不会重新编译,因此您无需删除经常会出错的结果空字段-pone

如果你愿意,你可以用sed做同样的事情。