cat
大きなテキストファイル(> 2GB)があり、行だけを書きたいとしますX
(Y
例:57890000〜57890010)。
私が理解している限り、パイプを接続するか、その逆にすることができhead
ますtail
。
head -A /path/to/file | tail -B
または代替的に
tail -C /path/to/file | head -D
そのうちA
、、、B
はファイルの行数に基づいて計算できますC
。D
X
Y
しかし、このアプローチには2つの問題があります。
A
、B
を計算する必要がありますC
。D
- コマンドは
pipe
互いに渡すことができます。もっとあります私が読みたい行よりも(例えば、大きなファイルの途中で数行だけ読む場合)
シェルで私が望む行だけを処理して出力する方法はありますか? (同時にANDのみ可能ですX
。)Y
?
ベストアンサー1
解決策を提案したいが、sed
完全性のために
awk 'NR >= 57890000 && NR <= 57890010' /path/to/file
最後の行の後ろから切り取るには:
awk 'NR < 57890000 { next } { print } NR == 57890010 { exit }' /path/to/file
速度テスト(ここではmacOS、他のシステムではYMMV):
- 100,000,000ラインファイルの生成
seq 100000000 > test.in
- 読み取った行数 50,000,000-50,000,010
- 特別な順序なしでテスト
real
bash
組み込み時間レポートtime
4.373 4.418 4.395 tail -n+50000000 test.in | head -n10
5.210 5.179 6.181 sed -n '50000000,50000010p;57890010q' test.in
5.525 5.475 5.488 head -n50000010 test.in | tail -n10
8.497 8.352 8.438 sed -n '50000000,50000010p' test.in
22.826 23.154 23.195 tail -n50000001 test.in | head -n10
25.694 25.908 27.638 ed -s test.in <<<"50000000,50000010p"
31.348 28.140 30.574 awk 'NR<57890000{next}1;NR==57890010{exit}' test.in
51.359 50.919 51.127 awk 'NR >= 57890000 && NR <= 57890010' test.in
これは決して正確なベンチマークではありませんが、各コマンドの相対速度に関する良いアイデアを提供するのに十分な違いがあり、繰り返し可能です。
*:最初の2つの間の合計をsed -n p;q
除いて、head|tail
本質的に同じように見えます。