2010-09-12 17 views
2

我在我的bash腳本中使用這段代碼來讀取包含多個十六進制字符串的文件,進行一些替換,然後將其寫入新的文件。約300 Mb大約需要30分鐘。
我想知道如果這可以做得更快?這可以做得更快(讀取文件,替代[sed],寫入新文件)

sed 's,[0-9A-Z]\{2\},\\\\x&,g' ${in_file} | while read line; do 
printf "%b" ${line} >> ${out_file} 
printf '\000\000' >> ${out_file} 
done 

更新:

我做了一些測試,並得到了以下結果:

獲獎者是:


sed 's,[0-9A-Z]\{2\},\\\\x&,g' ${in_file} | while read line; do 
    printf "%b" ${line} >> ${out_file} 
    printf '\000\000' >> ${out_file} 
done 

真正44m27.021s
ü SER 29m17.640s
SYS 15m1.070s


sed 's,[0-9A-Z]\{2\},\\\\x&,g' ${in_file} | while read line; do 
    printf '%b\000\000' ${line} 
done >> ${out_file} 

真正18m50.288s
用戶8m46.400s
SYS 10m10.170s


export LANG=C 
sed 's/$/0000/' ${in_file} | xxd -r -ps >> ${out_file} 

真正0m31.528s
用戶0m1 .850s
sys 0m29.450s


+0

顯示輸入文件的例子,你的輸出格式 – ghostdog74 2010-09-12 10:49:43

+0

招數調用之前運行此更改爲快速C語言環境:export LANG = C – LatinSuD 2010-09-12 11:00:57

+0

@LatinSuD。不明白你的意思。 – 2010-09-12 11:14:03

回答

4

您需要Vim自帶的xxd命令。

export LANG=C 
sed 's/$/0000/' ${in_file} | xxd -r -ps > ${out_file} 
+0

Thx,我會試試看。 – 2010-09-12 11:26:00

+0

+1:我從來沒有考慮過'xxd'可以反向使用! – Johnsyweb 2010-09-12 11:26:57

+0

Thx !!。你是贏家。 – 2010-09-12 14:03:11

3

由於bash中的循環,這很慢。如果你可以得到sed/awk/perl/etc來做循環,那將會更快。我看不出你如何在sed或awk中做到這一點。對於perl來說可能很容易,但我不知道perl爲你回答這個問題。

最起碼,你應該能夠通過重構你有什麼要節省一點時間:

sed 's,[0-9A-Z]\{2\},\\\\x&,g' ${in_file} | while read line; do 
printf '%b\000\000' ${line} 
done >> ${out_file} 

至少這樣,你每次迭代和開/關$ printf的一次運行{out_file}一次。

+1

+1用於指出對同一文件的多個重定向比僅僅一個慢(讀:具有常識)。 – amphetamachine 2010-09-12 11:01:03

+0

您的意思是** printf'%b $ {line} \ 000 \ 000'**,因爲**'\ 000 \ 000'**會變成** printf「%b」$ {line} ** – 2010-09-12 11:07:42

+0

@Robertico:不,我是這樣寫的。 '%b \ 000 \ 000'是格式字符串,$ {line}是%b使用的參數。 – camh 2010-09-12 11:18:50

2

切換到完整的編程語言?這是紅寶石單線:

ruby -ne 'print "#{$_.chomp.gsub(/[0-9A-F]{2}/) { |s| s.to_i(16).chr }}\x00\x00"' 
+0

Thx,但我喜歡它:-) – 2010-09-12 11:16:16

0

,如果你有Python和假設數據是簡單

$ cat file 
99 
AB 

腳本:

o=open("outfile","w") 
for line in open("file"): 
    s=chr(int(line.rstrip(),16))+chr(000)+chr(000) 
    o.write(s) 
o.close()