Bash 在100+;MB SQL转储

Bash 在100+;MB SQL转储,bash,awk,sed,Bash,Awk,Sed,我在这里看到了一些sed和awk的答案,但还没有找到解决我问题的方法 我在一小时后终止了mysql转储导入,当我向转储添加一些行时,导入只需要3分钟(如中所述) 我需要在“提交;”的第一次出现之后添加一些行,在“提交;”的第二次(也是最后一次)出现之前添加一些行,并在文件的结尾添加一些行 由于每X周或每个月都会获取一个更新的转储文件,所以我希望让我的脚本执行此操作,您将如何执行此操作 注意:这三个块是静态的,因此它们也可以是文本文件 抽象示例文本将是 block1.sql ALTER TABLE

我在这里看到了一些sed和awk的答案,但还没有找到解决我问题的方法

我在一小时后终止了mysql转储导入,当我向转储添加一些行时,导入只需要3分钟(如中所述)

我需要在“提交;”的第一次出现之后添加一些行,在“提交;”的第二次(也是最后一次)出现之前添加一些行,并在文件的结尾添加一些行

由于每X周或每个月都会获取一个更新的转储文件,所以我希望让我的脚本执行此操作,您将如何执行此操作

注意:这三个块是静态的,因此它们也可以是文本文件

抽象示例文本将是

block1.sql

ALTER TABLE `table1_name` DISABLE KEYS;
ALTER TABLE `table2_name` DISABLE KEYS;
ALTER TABLE `table3_name` DISABLE KEYS;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
block2.sql

SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
block3.sql

ALTER TABLE `table1_name` ENABLE KEYS;
ALTER TABLE `table2_name` ENABLE KEYS;
ALTER TABLE `table3_name` ENABLE KEYS;
dump.sql

/* starts with SET.., BEGIN... and some CREATE TABLE... */
COMMIT;
/* insert block1.sql here */
INSERT INTO table1_name VALUES(1,2,3,4,5);
INSERT INTO table2_name VALUES(1,2,3,4,5);
INSERT INTO table3_name VALUES(1,2,3,4,5);
/* and so on, inserting all the dump data */
/* insert block2.sql here */
COMMIT;
create index index1 on table1_name(columnname);
create index index2 on table2_name(columnname);
create index index3 on table3_name(columnname);
/* and so on, creating all the indexes */
/* insert block3.sql at end of file */
更新和解决方案

我用测试文件修改了Daweo的提案

#!/bin/bash

awk '{if(/^COMMIT;$/){if(!seen){print $0;while(getline<"block1.txt"){print};seen=1}else{val=$0;while(getline<"block2.txt"){print};print val}}else{print $0}}END{while(getline<"block3.txt"){print}}' testfile.tst
我需要在第一次出现“COMMIT;”之后添加一些行,在第二次(也是最后一次)出现“COMMIT;”之前添加一些行,并在文件末尾添加一些行

我会用GNU
AWK
按照下面的方式来做,让
file.txt
内容

someline1
COMMIT;
someline2
someline3
someline4
COMMIT;
someline5
然后

输出

someline1
COMMIT;
block1
someline2
someline3
someline4
block2
COMMIT;
someline5
block3
说明:如果整行是
COMMIT我在该行(
$0
)之后打印
块2
,如果该行已被其他人看到,即我打印该行,后跟
块1
,并将其标记为已被看到。在处理完整个文件后,我使用
END{
..
}
构造执行
打印
块3
的操作

免责声明:此解决方案假定插入的是蚀刻在石头上的,并且永远不会更改,因此可能是硬编码的。如果需要多行插入,请使用
\n
,例如,使用
“block1A\nblock1B”替换
“block1”

someline1
COMMIT;
block1A
block1B
someline2
someline3
someline4
block2
COMMIT;
someline5
block3
(在gawk 4.2.1中测试)

我需要在第一次出现“COMMIT;”之后添加一些行,在第二次(也是最后一次)出现“COMMIT;”之前添加一些行,并在文件末尾添加一些行

我会用GNU
AWK
按照下面的方式来做,让
file.txt
内容

someline1
COMMIT;
someline2
someline3
someline4
COMMIT;
someline5
然后

输出

someline1
COMMIT;
block1
someline2
someline3
someline4
block2
COMMIT;
someline5
block3
说明:如果整行是
COMMIT我在该行(
$0
)之后打印
块2
,如果该行已被其他人看到,即我打印该行,后跟
块1
,并将其标记为已被看到。在处理完整个文件后,我使用
END{
..
}
构造执行
打印
块3
的操作

免责声明:此解决方案假定插入的是蚀刻在石头上的,并且永远不会更改,因此可能是硬编码的。如果需要多行插入,请使用
\n
,例如,使用
“block1A\nblock1B”替换
“block1”

someline1
COMMIT;
block1A
block1B
someline2
someline3
someline4
block2
COMMIT;
someline5
block3

(在gawk 4.2.1中测试)

使用
ed
文本编辑器(确实需要足够的内存来加载文件;希望不是只有100多MB的问题):


ed-s dump.sql使用
ed
文本编辑器(确实需要足够的内存来加载文件;希望不是只有100多MB的问题):


ed-s dump.sql谢谢,我将用您提案中的解决方案更新我的问题。谢谢,我将用您提案中的解决方案更新我的问题。