最後の 5 行の表示


単に最後の 5 行かと思っていたら、面白い方向に議論が進んでいるようです。というか、Golf ネタのような感じかな。

質問は最後の 5 行と最後から手前 10 行目の出力ということです。

$ seq 10000000 > /tmp/bigsequel

というテストファイルを用意します。

$ time -p awk 'NR==FNR{nr++;next} (FNR==nr-10) || (FNR>(nr-5))' /tmp/bigsequel /tmp/bigsequel
9999990
9999996
9999997
9999998
9999999
10000000
real 15.52
user 14.99
sys 0.22
$ time -p tac /tmp/bigsequel | awk 'NR==11||NR<=5; NR==11{exit}' | tac
9999990
9999996
9999997
9999998
9999999
10000000
real 0.02
user 0.00
sys 0.00

tac (cat の反対であることは言うまでもないですね) を使ったトリックですが、awk と tac で強力になる良い例ですね。
さらに、キャッシュが有効な場合にはもっと強力です。(これ、速すぎです)

$ seq 20000000 > /tmp/bigsequel
$ time -p tac /tmp/bigsequel | awk 'NR==11||NR<=5; NR==11{exit}' | tac
19999990
19999996
19999997
19999998
19999999
20000000
real 0.00
user 0.00
sys 0.00