2014-08-28 86 views
0

我有一個腳本,其中sed命令在輸入文件上工作。什麼可能是這個sed命令的更快更換?

sed -i 's/SESSION_ID/sid/g;s/TIME_HOUR/hh/g;s/TIME_MINUTE/mm/g;s/TIME_SECOND/ss/g;s/TIME_MILLISECOND/mss/g;s/MSISDN/MS/g;s/IMSI/IM/g;s/IMEISV/IV/g;s/name_ALLOCATED_UE_ADDRESS_IPV4/aI4/g;s/IPV6/I6/g;s/OPERATION_TYPE/OT/g;s/LOCATION_AREA_CODE/LC/g;s/CELL_IDENTITY/CI/g;s/RAT_TYPE/RT/g;s/APN/AP/g;s/COUNTRY_CODE/CC/g;s/NETWORK_CODE/NC/g;s/name_SGSN_ADDRESS_IPV4/sI4/g;s/QCI/QC/g;s/SUBSCRIBERGROUP/SG/g;s/MONITORING_KEY/MK/g;s/QUOTA_VOLUME_BIDIRECTIONAL/QV/g;s/MBR_UL/MU/g;s/MBR_DL/MD/g;s/RULE_ID/RD/g;' $FiletosqeezE 

現在的問題是..它需要更多的時間比預期得到執行。你能告訴我可以更快更換這個sed命令嗎?我們甚至可以在這裏得到perl的幫助.....謝謝。

+0

你預計它會花多少時間?例如,除非您可以利用額外的信息,例如在行首之前的所有字符串,否則您不太可能使其速度更快。 – paxdiablo 2014-08-28 04:59:41

+0

對不起,如果我聽起來很愚蠢......但並沒有明確表達你的觀點,例如「如線路起始處的所有字符串,例如」。 ....感謝您的回覆BTW ... – Geetika 2014-08-28 05:06:17

+0

給出了一個輸入樣本,以便可以完成優化。你的sed動作列表對於所有那些「獨立」模式的通用修改是快速的,但也許不是通用的(像1行上的許多術語或者在相反行中從不在同一行上,......) – NeronLeVelu 2014-08-28 05:44:27

回答

4

使用命令行的perl(接合所有的替換成一個單一的表達):

perl -i -pe ' 
    BEGIN { 
     %hash = qw(SESSION_ID sid TIME_HOUR hh TIME_MINUTE mm TIME_SECOND ss TIME_MILLISECOND mss MSISDN MS IMSI IM IMEISV IV name_ALLOCATED_UE_ADDRESS_IPV4 aI4 IPV6 I6 OPERATION_TYPE OT LOCATION_AREA_CODE LC CELL_IDENTITY CI RAT_TYPE RT APN AP COUNTRY_CODE CC NETWORK_CODE NC name_SGSN_ADDRESS_IPV4 sI4 QCI QC SUBSCRIBERGROUP SG MONITORING_KEY MK QUOTA_VOLUME_BIDIRECTIONAL QV MBR_UL MU MBR_DL MD RULE_ID RD); 
     $pat = join "|", sort {length($b) <=> length($a)} keys %hash; 
    } 
    s/\b($pat)\b/$hash{$1}/g; 
    ' $FiletosqeezE 

開關

  • -i:編輯到位<>文件(使備份如果分機供給)
  • -p:爲每個「行創建一個while(<>){...; print}行」在你的輸入文件中。
  • -e:通知perl在命令行上執行代碼。
+0

我想這是值得投票的,它運行速度比我的100M測試文件中的sed'選項快兩倍(儘管沒有替換)。 – paxdiablo 2014-08-28 05:21:19

2

如果您需要能夠真正做到所有每行的替代品,你不太可能能夠使其更快,至少sed本身。其他工具(如awkperl)可能會爲您提供改進。

如果有可能您可以利用額外信息您可能有,有一些方法可能使它更好。

例如,如果你只希望一個出現在每行每串(如SESSION_ID),你可以擺脫全球標誌g,這將意味着它不會處理行的其餘部分的每次更換。

或者,如果每一行永遠只能包含一個關鍵字(例如,既SESSION_IDTIME_HOUR沒有臺詞,你可以使用像awk做代,並使用next使得第一替補立即移動到下一行,而不是檢查所有其他

或者,如果你知道所有的關鍵字是在該行的開始,你可以改變你的替代品:

s/SESSION_ID/sid/g 

到:

s/^SESSION_ID/sid/ 

這可能會加快速度,因爲它不會有超越前幾個字符。

但是,如果沒有額外的信息,您可能會通過爲此特定目的創建一個硬編碼的程序而不是通過腳本使用更通用的sed來獲得更快的性能。

因此,您可以調整每個讀取調用的加載數據量等。我不希望因爲你的sed字符串是固定的而不是正則表達式,所以這是一個很大的改進,但是如果你願意投入前期工作,它可能是值得一試的。


對於它的價值,這sed命令,通過在我的箱子少於12秒的100M源文件輕盈,我不認爲糟糕。

只要確保無論您測試的選項是否正確測試。 措施,不要猜測!

1

根據著名的sed的一行文字: http://sed.sourceforge.net/sed1line.txt

如果修改替換這樣的:

sed 's/something/changed/g;s/another/one/g' 

sed '/something/ s//changed/g; /another/ s//one/g' 

你會得到改善,我測試它在一個小文件上,系統部分減半:

(precise)[email protected]:/tmp$ time sed 's/dog/cat/g;s/fox/horse/g;s/quick/slow/g;s/the/blah/g' n4.txt > n6.txt 

real 0m0.043s 
user 0m0.039s 
sys 0m0.004s 


(precise)[email protected]:/tmp$ time sed '/dog/ s//cat/g;/fox/ s//horse/g;/quick/ s//slow/g;/the/ s//blah/g' n4.txt > n6.txt 
real 0m0.052s 
user 0m0.050s 
sys 0m0.002s 
+0

我想知道爲什麼是這樣嗎?爲什麼這個實現不會優化它呢? – 2014-08-28 06:26:57

+0

我不知道我沒有看過sed源代碼,但它看起來確實有優化的餘地。 – 2014-08-28 06:32:54

+0

你的系統時間減半既沒有統計學意義也沒有用,順便說一句。 CPU時間是用戶+ sys,從原來的43時間到你版本中的52時間。然而,如前所述,一個樣本大小對於得出結論幾乎沒有用處。 – paxdiablo 2014-08-28 06:37:33