パターンに基づいてファイルを複数のファイルに分割する

パターンに基づいてファイルを複数のファイルに分割する

数百行の大きなファイルがあります。このファイルは、たとえば「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分割が正確に何回行われるかがわかります。

記載されているとおり、マーカーがデータ内に現れると、事態が悪化する可能性があることに注意してください。

関連情報