「の小さな拡張の質問です。大きなファイルのcat行xから行yまで":
大容量ファイル(2〜3GB)があります。私は単に「foo:」のある行から「goo:」のある行にcat/printしたいと思います。 「foo:」と「goo:」がファイルに一度だけ現れるとします。 「foo:」は「goo:」につながります。
これがこれまで私のアプローチです。
- まず、「foo:」と「goo:」を含む行を探します。
grep -nr "foo:" bigfile
- 返品
123456: foo: hello world!
と654321: goo: good bye!
- これらの開始行と終了行番号との違い(654321-123456 = 530865)がわかったら、オプションの猫を実行できます。
tail -n+123456 bigfile | head -n 530865
私の質問は、行番号定数を式(たとえばgrep ...)に効率的に置き換える方法です。
簡単なPythonスクリプトを書くことができますが、組み合わせたコマンドだけを使って実装したいと思います。
ベストアンサー1
sed -n '/foo/,/goo/p;/goo/q' <bigfile
これにより、対応する行だけが印刷されます。行番号が必要な場合は、1つを追加できます=
。
sed -n '/foo/=;/goo/=;//q' <bigfile
呼び出されると入力に合うq
ので重要です。それ以外の場合、infileは最後まで読み取られます。q
sed
その行を印刷したくない場合は、foo/goo
次のようにします。
GNUの使用sed
:
sed -n '/foo/,/goo/!d;//!p;/goo/q
' <<\DATA
line1
foo
line3
line4
line5
goo
line7
DATA
出力
line3
line4
line5
その他:
sed -n '/foo/G;/\n/,/goo/!d;//q;/\n/!p
' <<\DATA
line1
foo
line3
line4
line5
goo
line7
DATA
出力
line3
line4
line5
しかし、どちらかが検索の最後の行に出会うと、入力も終了します。