我想用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 /秒。我需要更快地运行。
另外,这里的瓶颈是什么?
我想用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 /秒。我需要更快地运行。
另外,这里的瓶颈是什么?
瓶颈可能是你为每一行数据产生了几个进程。作为替代,这AWK应该是等价的:
awk '{ split($0, a, "\""); print $2, $3, a[20] }' TEST.log > IDS.log
非常棒!谢谢。尽可能接受。 – 2015-02-24 13:10:57
嗯,为什么说'打印$ 2“”$ 3“? Way clean说'打印$ 2,$ 3',因为参数将被默认的FS分隔,也就是说,一个空间(你也在设置)。 – fedorqui 2015-02-24 13:52:05
我喜欢这样,所以我把它放进去(尽管它在这个特殊情况下没有什么不同)。 – Wintermute 2015-02-24 13:54:14
Perl中通常是非常快:
perl -nE 'say join " ", (split " ")[1,2], (split /"/)[19]' TEST.log > IDS.log
的Perl数组索引从0开始
不错,但Perl的'split'“'将连续空格视为_single_分隔符,与OP中相应的'cut'命令不同,因此您的答案可能会有所不同 - 最好使用split split。 – mklement0 2015-02-24 15:44:35
的瓶颈分叉,尝试单awk或sed – 2015-02-24 13:08:24