2016-11-17 53 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

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