N 行目から M 行目までを表示

ここに書かれていた

FNR >= N && FNR <= M

という書き方と

FNR == N, FNR == M

という書き方とどちらが高速なのかが風呂の中で気になったので調べてみました。
こういうのはサンプルが意地悪な方がハッキリします。

頭の中では、awk は '&&' の処理が遅いというのと、前者は式を 2 つ常に評価しなければいけないので遅く、後者は (結果的に '&&' な処理になっているかもしれないが awk をパースしているわけではないので) 式の評価が片側だけなので高速なのではないかという勝手な推論を立てているわけですが、実証してみないと分からない、いやスクリプト言語ならやった方が早いので、やってみました。

$ seq 10000000 > test.txt                            
$ time awk 'FNR>=1&&FNR<=10000000' test.txt > /dev/null
awk 'FNR>=1&&FNR<=10000000' test.txt > /dev/null  15.41s user 0.34s system 49% cpu 31.921 total
$ time awk 'FNR==1,FNR==10000000' test.txt > /dev/null
awk 'FNR==1,FNR==10000000' test.txt > /dev/null  10.85s user 0.19s system 85% cpu 12.987 total

予想通り後者が高速でした。