哪一个处理速度更快?用Awk或Cut打印列?

时间:2010-12-07 08:13:28

标签: unix awk

我有大约1亿行和6个用空格分隔的字段,每个字段都有7位数字。

我想删除第二个字段,可以使用以下

来实现
1. awk '{print $1,$3,$4,$5,$6}' input.txt

2. cut --delimiter=' ' --fields=1,3-6 input.txt

哪一个更快获得所需的输出?有没有办法计算时间?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  

有没有办法为这个过程计时?

是。只需在命令之前添加命令time,它就会返回它所花费的时间。为每个人做。

time awk '{print $1,$3,$4,$5,$6}' input.txt
time cut --delimiter=' ' --fields=1,3-6 input.txt

通过快速分析,看起来cut在这种情况下几乎没有胜出。 awk考虑到cut的能力有多强,这仍然是令人印象深刻的时间。

$ time for i in {1..1000}; do cut --delimiter=' ' --fields=1,3-6 >/dev/null <<<"one two three four five six seven"; done

real    0m4.074s
user    0m0.496s
sys     0m2.799s

AWK

$ time for i in {1..1000}; do awk '{print $1,$3,$4,$5,$6}' >/dev/null <<<"one two three four five six seven"; done

real    0m4.511s
user    0m0.728s
sys     0m3.165s

答案 1 :(得分:0)

我测试了它,结果是:

  

AWK更快

我用~2万行文件进行了测试:

它只是一个带有标准分隔符的剪切,并打印到文件。

正如你所看到的,在这种情况下,AWK的速度要快3倍(尝试自己一样)

<强>演示:

fow /home/admin/tei # wc -l prueba
2088036 prueba    
fow /home/admin/tei # cat test.sh
date +%s
awk '{print $2}' prueba > ok
date +%s
cut -d" " -f2 prueba > ok2
date +%s
fow /home/admin/tei # ./test.sh
1484848197
1484848199
1484848204
fow /home/admin/tei #

这里有一些关于使awk更快的原因的文档:

http://www.linuxquestions.org/questions/programming-9/which-one-is-efficient-cut-cmd-or-using-awk-783673/

https://lyness.io/the-functional-and-performance-differences-of-sed-awk-and-other-unix-parsing-utilities

希望有所帮助