我有大约 1 亿行和 6 个由空格分隔的字段,每个字段都有七位数字。
我喜欢删除第二个字段,可以通过以下方式实现
1. awk '{print $1,$3,$4,$5,$6}' input.txt
2. cut --delimiter=' ' --fields=1,3-6 input.txt
Run Code Online (Sandbox Code Playgroud)
哪一个更快地获得所需的输出?有没有办法计时这个过程?
感谢您的帮助。
有没有办法计时这个过程?
是的。time只需在代码之前添加命令,它就会返回花费的时间。为每一个人做这件事。
time awk '{print $1,$3,$4,$5,$6}' input.txt
time cut --delimiter=' ' --fields=1,3-6 input.txt
Run Code Online (Sandbox Code Playgroud)
通过快速的分析,看起来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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
我\xc2\xb4ve测试过,结果是:
\n\n\n\n\nAWK 更快
\n
我用大约 200 万行的文件进行了测试:
\n\n它\xc2\xb4只是一个带有标准分隔符的剪切,并打印到文件。
\n\n正如您所看到的,在这种情况下,AWK 的速度快了约 3 倍(您自己也尝试一下)
\n\n示范:
\n\n# wc -l prueba\n2088036 prueba \n# cat test.sh\ndate +%s\nawk \'{print $2}\' prueba > ok\ndate +%s\ncut -d" " -f2 prueba > ok2\ndate +%s\n# ./test.sh\n1484848197\n1484848199\n1484848204\nRun Code Online (Sandbox Code Playgroud)\n\n这里有一些关于使 awk 更快的原因的文档:
\n\n\n\n\n\n希望能帮助到你
\n