2015-02-24 150 views
1

我想用bash循環處理一個文件(1.5GB)以迭代每一行。我用cut,因其簡單性(相對)和結束:Bash while循環+切慢

while read line 
do 
    echo "$(echo $line | cut -d' ' -f 2-3)" "$(echo $line | cut -d'"' -f 20)" 
done <TEST.log> IDS.log 

這是非常緩慢的,只做大約2KB /秒。我需要更快地運行。

另外,這裏的瓶頸是什麼?

+1

的瓶頸分叉,嘗試單awk或sed – 2015-02-24 13:08:24

回答

4

瓶頸可能是你爲每一行數據產生了幾個進程。作爲替代,這AWK應該是等價的:

awk '{ split($0, a, "\""); print $2, $3, a[20] }' TEST.log > IDS.log 
+0

非常棒!謝謝。儘可能接受。 – 2015-02-24 13:10:57

+1

嗯,爲什麼說'打印$ 2「」$ 3「? Way clean說'打印$ 2,$ 3',因爲參數將被默認的FS分隔,也就是說,一個空間(你也在設置)。 – fedorqui 2015-02-24 13:52:05

+0

我喜歡這樣,所以我把它放進去(儘管它在這個特殊情況下沒有什麼不同)。 – Wintermute 2015-02-24 13:54:14

4

Perl中通常是非常快:

perl -nE 'say join " ", (split " ")[1,2], (split /"/)[19]' TEST.log > IDS.log 

的Perl數組索引從0開始

+0

不錯,但Perl的'split'「'將連續空格視爲_single_分隔符,與OP中相應的'cut'命令不同,因此您的答案可能會有所不同 - 最好使用split split。 – mklement0 2015-02-24 15:44:35