頭、尾、そしてライン? [コピー]

頭、尾、そしてライン? [コピー]

番号で指定されたファイルから1行を抽出する最も簡単な方法は何ですか?たとえば、行666が必要ですsomefile。端末またはシェルスクリプトでこれをどのように実行しますか?

head -n 666 somefile | tail -n 1同様の解決策、さらにわずかに合う解決策を見ることができますが、cat -n somefile | grep -F 666より良い、速く、より強力な解決策が必要です。もっと曖昧なUnixコマンド/ユーティリティを使用していますか?

答え1

sedSトレメ編集するitor)はこの種の作業に適したツールです。

sed -n '666p' somefile

編集:@tachomiのソリューションは、sed '666q;d' somefile大容量のテキストファイルを処理するのに適しています。sedファイルの残りの部分を読み取らずにパターンを印刷して終了します。他のすべてのファイルの違いは重要ではありません。

答え2

あなたはsedを使用することができます

sed -n '666p' somefile

または

sed '666!d' somefile

または大容量ファイルに

sed '666q;d' somefile 

Bashスクリプトから

#!/usr/bin/bash
line=666
sed "$line"'q;d' somefile

答え3

POSIXly(大容量ファイルの場合は最速):

tail -n +666 | head -n1

答え4

パール方式:

perl -ne 'print && exit if $.==666' file

1から999999までの数字を含むファイルを生成してテストしました。この記事では、awk上と下のPerlソリューションは、exitこれまでに述べたソリューションの中で最も速いソリューションです。

$ perl -le 'print for 1..999999' > file

$ time perl -ne 'print && exit if $.==666' file
666

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time awk 'NR==666 { print ; exit ; } ' file
666

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time tail -n +666 file | head -n1
666

real    0m0.021s
user    0m0.004s
sys     0m0.000s

$ time sed -n '666p' file
666

real    0m0.125s
user    0m0.112s
sys     0m0.012s

$ time awk 'NR==666' file
666

real    0m0.161s
user    0m0.156s
sys     0m0.000s

つまり、初期のソリューションはhead -n666 file | tail -n1非常に高速で強力で移植性に優れています。なぜそうではないと思いますか?

関連情報