awkまたはSedを使用して実行できますか?大きなファイルを小さなファイルに分割します。 2つのマーカー間の線

awkまたはSedを使用して実行できますか?大きなファイルを小さなファイルに分割します。 2つのマーカー間の線

awkorを使ってこのようなことをすることはできますかsed? ...またはperlORを使用する必要がありますpython(またはC ++が最も快適であるため、C ++を使用しているようです)?

カテゴリとサブカテゴリのアイテムのリストを含むファイルがあるとします。

*鳥
  - スズメ
  - カササギ
  - カラス
  - オウム
*哺乳類
  *ペット動物
    - 犬
    - 猫
    - ウサギ
  *害虫
    - ゴミパンダ
    - スカンク
*魚
  - マス
  - ニシン
  - サーモン
(...)

これには、新しい、哺乳類、魚(哺乳類の下の2つのサブカテゴリを分割する必要はありません)の3つのファイルに分割する必要があり、1つのカテゴリと次のカテゴリ(またはファイルの終わり)の間のコンテンツが含まれます。もう1つのアプローチは、最初のカテゴリ/ファイルから始めて2番目のカテゴリをファイルに出力し、繰り返す前に元のファイルから自動/手動で削除することです。

基本的に私が知りたいのは、2つのタグ間(ここでは2つのタグ間)に何かを作成awkまたは出力する方法です。sed*

答え1

*カテゴリ行の最初の文字であると仮定すると

$ awk '/^\*/{close(f); f=$2; next} f{print > f}' file

$ head Birds Mammals Fish
==> Birds <==
  - Sparrow
  - Magpie
  - Crow
  - Parrot

==> Mammals <==
  * Pets
    - Dog
    - Cat
    - Rabbit
  * Pests
    - Trash-panda
    - Skunk

==> Fish <==
  - Trout
  - Herring
  - Salmon

答え2

csplitユーティリティは、この例に示すように、コンテキストに従ってファイルを分割するために使用されます。

csplit -sz yourfile '/^[*]/' '{*}'
for f in xx*
do {
  dst=$(head -n 1 -|cut -d' ' -f2)
  cat - > "$dst"
} < "$f"
done
head Birds Fish Mammals
==> Birds <==
  - Sparrow
  - Magpie
  - Crow
  - Parrot

==> Fish <==
  - Trout
  - Herring
  - Salmon

==> Mammals <==
  * Pets
    - Dog
    - Cat
    - Rabbit
  * Pests
    - Trash-panda
    - Skunk

関連情報