2016-11-17 106 views
1

我有一个文件,我只想替换以“at line”结尾的行;与“在[line_number]行;”搜索并替换sed以38 MB文件的天文时间

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

例如输入文件:

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的机器。我想用台阶标记工具的结果发布它的细节来证明它不是问题。但是我认为这并不是必须的,因为问题是显而易见的(在整个文件上运行sed重复1000055次/次)给在这种情况下有一定知识的人。顺便说一句,我知道有些人不喜欢用猫。但我习惯了。为了主要讨论请求忽略。

+1

'这里不需要grep',您可以用'awk'的一样。 – Inian

+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 ;结束,awkgsub将使用NR实行号替换文本‘在行’的佳句。

+0

为什么你在排队之前的代码块匹配时,它必须存在的gsub无论如何做任何事情。他们也想保持整个'在线' – 123

+0

这个基于awk的解决方案在性能数据方面更好。 时间AWK '{GSUB(/在线; “在线” NR /, “;”)} 1'?c.txt> d.txt 真实0m1.741s 用户0m0.703s SYS 0m1.033s ? 时间的sed的/ \([1-9] [0-9] * \)\(:系统在回声线\)/ \ 1 \ 2 \ 1/G'< c.txt > d.txt 实0m5.425s 用户0m4.103s sys 0m1.310s –

1

一个简单sed线就足够了,如果数字是相同的开始:

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

好的。全面的解决方案。 –