我有一个文件,我只想替换结尾为“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次)对于在此上下文中具有一定知识的人。顺便说一句,我知道有些人不喜欢用猫。但我已经习惯了。请求忽略主要讨论。
答案 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