3

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

逗号怎么了?

4

2 回答 2

1

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

于 2013-10-04T14:18:00.923 回答
1

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

  1. 设置FS=OFS=","而不是仅仅FS=","使用逗号重建记录,或者
  2. 不要为字段赋值,而是使用 RE 对整条记录进行操作。

您已经知道如何执行“1”,然后您需要剥离双 OFS 以删除空字段,以下是如何使用 GNU awk for 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 做同样的事情。

于 2013-10-04T14:38:52.757 回答