使用sed进行搜索和替换,获取38 MB文件的天文时间

时间:2016-11-17 09:33:43

标签: bash awk sed grep

我有一个文件,我只想替换结尾为“at line”的行。 “at line [line_number];”

每个偶数行都有目标语句。

示例输入文件:

0000001:use test;
0000002:system echo at line ;
0000003:insert into pet values ('9999', '7777');
0000004:system echo at line ;
0000005:insert into pet values ('9999', '7777');
0000006:system echo at line ;

示例输出文件:

0000001:use test;
0000002:system echo at line 2;
0000003:insert into pet values ('9999', '7777');
0000004:system echo at line 4;
0000005:insert into pet values ('9999', '7777');
0000006:system echo at line 6;

我用awk编写了一个脚本来生成sed命令。运行时,需要数天才能完成1000055行文件的任务。

是否有更好的(基于脚本的)技术?

以下是当前方法的要点:

$head -6 c.txt
0000001:use test;
0000002:system echo at line ;
0000003:insert into pet values ('9999', '7777');
0000004:system echo at line ;
0000005:insert into pet values ('9999', '7777');
0000006:system echo at line ;

$wc c.txt
 1000055  5500241 39501572 c.txt

$cat c.txt | grep "at line" | awk -F":" '{printf("sed -i \x27%ds/at line ;/at line %d;/\x27 c.txt\n", $1, $1)}' > a.sh

$time sh ./a.sh

注意:正在运行测试的计算机是服务器类计算机上的单个vm。我想用基准测试工具的结果发布它的细节,以证明它不是问题。但我认为这不是必需的,因为问题是显而易见的(在整个文件中重复执行1000055/2次)对于在此上下文中具有一定知识的人。顺便说一句,我知道有些人不喜欢用猫。但我已经习惯了。请求忽略主要讨论。

2 个答案:

答案 0 :(得分:4)

 awk '{gsub(/at line ;/,"at line " NR";")}1' sample
0000001:use test;
0000002:system echo at line 2;
0000003:insert into pet values ('9999', '7777');
0000004:system echo at line 4;
0000005:insert into pet values ('9999', '7777');
0000006:system echo at line 6;

这将对仅以at line ;结尾的行进行操作,而awk' s gsub将替换文字"在第"行使用NR的实际行号。

答案 1 :(得分:1)

如果数字与开头相同,那么简单的sed行就足够了:

sed 's/\([1-9][0-9]*\)\(:system echo at line \)/\1\2\1/g' < file.txt