解決策 1:
sed -n '10000000,10000020p' filename
次のように少しスピードアップできるかもしれません:
sed -n '10000000,10000020p; 10000021q' filename
これらのコマンドでは、オプション -n
sed
を引き起こす 「パターンスペースの自動印刷を抑制する」。 p
コマンド「print[s] the current pattern space」と q
コマンド「これ以上入力を処理せずに sed スクリプトを直ちに終了します...」 引用は sed
からのものです man
ページ。
ところで、あなたの命令
tail -n 10000000 filename | head 10
最後から 1,000 万行目から開始 ファイルの「中間」コマンドは、先頭から 1,000 万番目から始まるように見えます。 これは次と同等です:
head -n 10000010 filename | tail 10
問題は、可変長の行を持つソートされていないファイルの場合、改行をカウントするファイルを処理する必要があることです。それをショートカットする方法はありません。
ただし、ファイルがソートされている場合 (たとえば、タイムスタンプ付きのログ ファイル)、または固定長の行がある場合は、バイト位置に基づいてファイルをシークできます。ログ ファイルの例では、Python スクリプト here* が行うように、時間の範囲でバイナリ検索を実行できます。固定レコード長ファイルの場合は、実に簡単です。 linelength * linecount
を求めるだけです
解決策 2:
sed
の次の使用法を見つけました
sed -n '10000000,+20p' filename
誰かの役に立てば幸いです!
解決策 3:
ここに投稿するのは初めてです!とにかく、これは簡単です。 file.txt というファイルから 8872 行目を取り出したいとしましょう。方法は次のとおりです。
cat -n file.txt | grep '^ *8872'
問題は、この後の 20 行を見つけることです。これを達成するには、
cat -n file.txt | grep -A 20 '^ *8872'
前後の行については、grep マニュアルの -B および -C フラグを参照してください。