測定された時間の一部は次のとおりです。

測定された時間の一部は次のとおりです。

cat大きなテキストファイル(> 2GB)があり、行だけを書きたいとしますXY例:57890000〜57890010)。

私が理解している限り、パイプを接続するか、その逆にすることができheadますtail

head -A /path/to/file | tail -B

または代替的に

tail -C /path/to/file | head -D

そのうちA、、、Bはファイルの行数に基づいて計算できますCDXY

しかし、このアプローチには2つの問題があります。

  1. ABを計算する必要がありますCD
  2. コマンドは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
  • 特別な順序なしでテスト
  • realbash組み込み時間レポート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本質的に同じように見えます。

おすすめ記事