2

我有一个包含查询的文件,每个查询都以“;”结尾,我想添加一个“COMMIT;BEGIN;” 每 100 个查询。查询可以多于 1 行。

例如:


    INSERT INTO table
    VALUES(...);
    DELETE FROM table WHERE ...;
    UPDATE table
    SET ...;

所以我想每 100 个“;”更换一次 用“提交;开始;” (我知道我必须添加一个 BEGIN; 在文件的开头并在最后做一些事情,但这很容易)

我需要在 shell 脚本中执行此操作,但我不是 Linux 专家,使用 sed 还是 awk 更好(文件大小也可以像 4GB 一样大)?我知道这些命令的基础知识,但我不知道我是否可以在这里做我想做的事......

谢谢!

4

4 回答 4

1

如果您可以保证 the;位于行尾,或者您并不真正关心带有多个;'s 的行,那么简单的解决方案(未经测试)是:

awk '/;/{ count+=1 } {print} count==100 { print "COMMIT; BEGIN"; count=0 }'
于 2012-06-05T17:17:40.737 回答
1

我建议不要尝试替换分号。取而代之的是,“解析”所有命令,BEGINCOMMIT围绕您要提交的一堆命令。使用 sed 这很容易。如果你有这个文件:

$ cat my.sql 
INSERT INTO table VALUES (1);
INSERT INTO table VALUES (2);
INSERT INTO table VALUES (3);
INSERT INTO table VALUES (4);
INSERT INTO table VALUES (5);
INSERT INTO table VALUES (6);
INSERT INTO table VALUES (7);
INSERT INTO table VALUES (8);
INSERT INTO table VALUES (9);
INSERT INTO table VALUES (10);

只需运行以下命令:

$ sed -n 'H;${x;s/\([^;]*;\)\{,3\}/BEGIN;&\nCOMMIT;\n\n/g;p}' my.sql 
BEGIN;
INSERT INTO table VALUES (1);
INSERT INTO table VALUES (2);
INSERT INTO table VALUES (3);
COMMIT;

BEGIN;
INSERT INTO table VALUES (4);
INSERT INTO table VALUES (5);
INSERT INTO table VALUES (6);
COMMIT;

BEGIN;
INSERT INTO table VALUES (7);
INSERT INTO table VALUES (8);
INSERT INTO table VALUES (9);
COMMIT;

BEGIN;
INSERT INTO table VALUES (10);
COMMIT;

(为了清楚起见,这里我使用 3 作为块的大小。对于“包含”100 个命令的块,替换\{,3\}\{,100\}

它有什么作用?

  • 首先,我们禁止打印带有 的行-n。现在 sed 只会在我们命令它显式打印它们时打印它们。

  • 现在,对于每一行,我们将该行附加到具有H.

  • 在最后一行(地址$),我们执行一个命令块(从 开始到{结束})。第一个命令,x交换保持空间(现在包含所有文件)和模式空间的内容。

  • 在此之后,我们用s///n (0 < n <= 3) 系列字符(没有一个;;替换字符串BEGIN;,匹配的命令块(由 表示&)和字符串\nCOMMIT;\n\n(为了更好的可读性而使用换行符。

  • 最后,我们用 打印模式空间的内容p

于 2012-06-05T17:30:36.313 回答
0

如果分号位于行尾:

awk '{print} /;$/ && ! (count++%100) {print "COMMIT; BEGIN;"}' inputfile

如果精确计算 100 个分号很重要,并且它们可能位于一行中的任何位置,那么它可以完成,但它会变得有点复杂。

于 2012-06-05T17:27:45.020 回答
0

这可能对你有用(GNU sed);

sed ':a;$!{N;ba};s/^\([^;]*\(;[^\n][^;]*\)*;\s*$\)\{100\}/&\nCOMMIT;BEGIN;/mg' file
于 2012-06-05T20:59:24.613 回答