私のテストによると、パフォーマンスと読みやすさの観点から、私の推奨は次のとおりです。
tail -n+N | head -1
N
必要な行番号です。たとえばtail -n+7 input.txt | head -1
、ファイルの7行目を印刷します。
tail -n+N
行から始まるものが印刷されますN
、そしてhead -1
、それは1行の後に停止になります。
代替案head -N | tail -1
は、おそらく少し読みやすくなります。たとえば、これは7行目を出力します。
head -7 input.txt | tail -1
パフォーマンスに関しては、サイズが小さくても大きな違いはありませんがtail | head
、ファイルが大きくなると(上から)パフォーマンスが向上します。
トップ投票sed 'NUMq;d'
は知っておくと面白いですが、頭と尾のソリューションよりも最初から理解できる人は少なく、尾/頭よりも遅いと私は主張します。
私のテストでは、両方のテール/ヘッドバージョンがsed 'NUMq;d'
一貫してパフォーマンスを向上させました。これは、投稿された他のベンチマークと一致しています。テール/ヘッドが本当に悪かったケースを見つけるのは難しいです。これらは最近のUnixシステムで大幅に最適化されることが予想される操作であるため、これも驚くべきことではありません。
パフォーマンスの違いについてのアイデアを得るために、これらは私が巨大なファイル(9.3G)について取得する数です:
tail -n+N | head -1
:3.7秒
head -N | tail -1
:4.6秒
sed Nq;d
:18.8秒
結果は異なる場合がありますが、パフォーマンス head | tail
とtail | head
、一般的に、小さい入力に対して同等であり、sed
重要な要因(5X周り程度)によって常に遅いです。
私のベンチマークを再現するために、以下を試すことができますが、現在の作業ディレクトリに9.3Gファイルが作成されることに注意してください。
#!/bin/bash
readonly file=tmp-input.txt
readonly size=1000000000
readonly pos=500000000
readonly retries=3
seq 1 $size > $file
echo "*** head -N | tail -1 ***"
for i in $(seq 1 $retries) ; do
time head "-$pos" $file | tail -1
done
echo "-------------------------"
echo
echo "*** tail -n+N | head -1 ***"
echo
seq 1 $size > $file
ls -alhg $file
for i in $(seq 1 $retries) ; do
time tail -n+$pos $file | head -1
done
echo "-------------------------"
echo
echo "*** sed Nq;d ***"
echo
seq 1 $size > $file
ls -alhg $file
for i in $(seq 1 $retries) ; do
time sed $pos'q;d' $file
done
/bin/rm $file
これが私のマシンでの実行の出力です(SSDと16Gのメモリを搭載したThinkPad X1 Carbon)。最終的な実行では、すべてがディスクからではなく、キャッシュから取得されると思います。
*** head -N | tail -1 ***
500000000
real 0m9,800s
user 0m7,328s
sys 0m4,081s
500000000
real 0m4,231s
user 0m5,415s
sys 0m2,789s
500000000
real 0m4,636s
user 0m5,935s
sys 0m2,684s
-------------------------
*** tail -n+N | head -1 ***
-rw-r--r-- 1 phil 9,3G Jan 19 19:49 tmp-input.txt
500000000
real 0m6,452s
user 0m3,367s
sys 0m1,498s
500000000
real 0m3,890s
user 0m2,921s
sys 0m0,952s
500000000
real 0m3,763s
user 0m3,004s
sys 0m0,760s
-------------------------
*** sed Nq;d ***
-rw-r--r-- 1 phil 9,3G Jan 19 19:50 tmp-input.txt
500000000
real 0m23,675s
user 0m21,557s
sys 0m1,523s
500000000
real 0m20,328s
user 0m18,971s
sys 0m1,308s
500000000
real 0m19,835s
user 0m18,830s
sys 0m1,004s
awk
、sed
誰かがPerlのワンライナーなどを思い付くと確信しています;)