2015-02-24 112 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