
数百行の大きなファイルがあります。このファイルは、たとえば「ABC」という特定の識別子によって複数の部分に分割されています。この行「ABC」は 6 回出現するため、出力ファイルを 6 つ作成する必要があります。split と awk についてはよく知っていますが、説明した内容を実行するコマンド ラインを作成できないようです。何かアイデアはありますか?
例を挙げてみましょう
ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1
ABC が新しいファイルの最初の行であり、次の ABC に遭遇する前に終了する 3 つのファイルが必要です。
答え1
使用csplit
csplit -z somefile /ABC/ '{*}'
出力ファイルはデフォルトではxx00
、、、xx01
...になりますが、必要に応じて形式と番号を変更できます。man csplit
答え2
NEEDLE=ABC
HAYSTACK=/path/to/bigfile
csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c -- $NEEDLE $HAYSTACK)-1))}"
for file in splitfile_*; do
sed --in-place "s/$NEEDLE//" $file
done
上記は、マーカー行のインスタンスがいくつあっても、要求どおりにファイルを分割し、結果のファイルからマーカーを削除します。出力ファイルは、たとえば、などと呼ばれsplitfile_00
ますsplitfile_01
。
呼び出しの最後の部分を分解しますcsplit
: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"
: サブシェルを使用してgrep
、ファイル内のマーカーのインスタンスの数を取得し、1 を減算します。これにより、csplit
分割が正確に何回行われるかがわかります。
記載されているとおり、マーカーがデータ内に現れると、事態が悪化する可能性があることに注意してください。