![頭、尾、そしてライン? [コピー]](https://linux33.com/image/72648/%E9%A0%AD%E3%80%81%E5%B0%BE%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E3%83%A9%E3%82%A4%E3%83%B3%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
番号で指定されたファイルから1行を抽出する最も簡単な方法は何ですか?たとえば、行666が必要ですsomefile
。端末またはシェルスクリプトでこれをどのように実行しますか?
head -n 666 somefile | tail -n 1
同様の解決策、さらにわずかに合う解決策を見ることができますが、cat -n somefile | grep -F 666
より良い、速く、より強力な解決策が必要です。もっと曖昧なUnixコマンド/ユーティリティを使用していますか?
答え1
sed(Sトレメ編集する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
非常に高速で強力で移植性に優れています。なぜそうではないと思いますか?