2015-06-25 53 views
2

據我所知,「while read」太慢了,因爲它讀取的是字節方式。 如果線條對我來說足夠了,是否有更高效的方法來做到這一點?bash:while read incrediblely slow

我有每行包含四個參數文件data.txt中:

1 56 56 48 
3 646 86 656 
4 56 894 959 
6 89 849 875 

,我想在每行上執行操作(每個值分配給用於進一步處理的變量)。

這是我要做的事現在:

cat data.txt | 
while read linewise; do 
par0=`echo $linewise |awk '{print $1}'`; 
par1=`echo $linewise |awk '{print $2}'`; 
par2=`echo $linewise |awk '{print $3}'`; 
par3=`echo $linewise |awk '{print $4}'`; 

echo $par0 $par1 $par2 $par3 
done 

但對於〜1000行文件,這需要半分鐘:

real 0m30.380s 
user 0m7.996s 
sys  0m11.820s 

如何可以加快這個嗎?

+0

這段代碼的主要開銷是每行調用外部程序'awk'四次,而不是'read'。如果您有1000行,則創建4000個子進程。你也在不必要地叫'貓',所以4001.所以半分鐘實際上是相當不錯的。 – cdarke

+0

你真的需要創建這4個shell變量嗎?你打算和他們做什麼?如果你真的希望它很快,你應該可以閱讀整個文件,並在awk的單個調用中進行處理,完全避免了「while read」循環。當然,這取決於你想要達到的目標。 –

+0

幾乎任何其他閱讀文件的方式都會比這更快。 – 123

回答

5

您可以通過刪除所有管道和調用subhells來加速它。下面的內容極大地簡化了你在做的事情:

while read -r par0 par1 par2 par3; do 
    echo $par0 $par1 $par2 $par3 
done < data.txt 
+0

謝謝!整個事情現在運行在0.241s。 – Heliosh

+0

儘管只是'awk'{print $ 1,$ 2,$ 3,$ 4}'data.txt'可能會更快,但仍然是一個很大的因素。如果可以的話,避免「讀取」。 – tripleee