![パターンに応じてファイルを複数のファイルに分割 [重複]](https://linux33.com/image/83790/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%88%86%E5%89%B2%20%5B%E9%87%8D%E8%A4%87%5D.png)
数百行の長さの大きなファイルがあります。ファイルは、「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
、分割できる正確な数を示します。
記録されているように、マーカーがデータに表示されると、状況が船の形に変わることがあります。