如果我有一个包含 800 万行的纯文本文件,并且我想将第 4,000,010 到 4,000,000 行打印到屏幕上,哪个会更有效:awk 还是 sed?
文本没有模式,不幸的是,数据库不是一个选项。我知道这并不理想,我只是好奇谁能更快地完成任务。
或者也许还有 sed 或 awk 更好的替代品?
答案1
两者都不是,使用tail
orhead
代替:
$ time tail -n 4000001 foo | head -n 11
real 0m0.039s
user 0m0.032s
sys 0m0.004s
$ time head -n 4000010 foo | tail -n 11
real 0m0.055s
user 0m0.064s
sys 0m0.036s
tail
事实上始终更快。我运行这两个命令 100 次并计算它们的平均值:
尾巴:
real 0.03962
user 0.02956
sys 0.01456
头:
real 0.06284
user 0.07356
sys 0.07244
我认为tail
速度更快,因为虽然它必须一直寻找到第 4e10 行,但它实际上不会打印任何内容,直到它到达那里,而head
会打印所有内容直到第 4e10 + 10 行。
与其他一些按时间顺序排序的方法相比:
sed:
$ time sed -n 4000000,4000011p;q foo
real 0m0.312s
user 0m0.236s
sys 0m0.072s
珀尔:
$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo
real 0m1.000s
user 0m0.936s
sys 0m0.064s
awk:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
基本上,规则是解析的越少,速度就越快。将输入视为只需要打印到屏幕上的数据流(就像tail
以前那样)始终是最快的方法。