可以用 awk 或 Sed 来做吗?将大文件分割成更小的文件。两个标记之间的线

可以用 awk 或 Sed 来做吗?将大文件分割成更小的文件。两个标记之间的线

是否可以用awkor做这样的事情sed? ...或者我必须使用perlor python(或者我猜是 C++,因为那是我最舒服的)?

假设我有一个文件,其中包含类别和子类别中的项目列表:

* 鸟类
  - 麻雀
  - 喜鹊
  - 乌鸦
  - 鹦鹉
* 哺乳动物
  * 宠物
    - 狗
    - 猫
    - 兔子
  * 害虫
    - 垃圾熊猫
    - 臭鼬
* 鱼
  - 鳟鱼
  - 鲱鱼
  - 三文鱼
(...)

这应该分为三个文件 - 鸟类、哺乳动物和鱼类(不需要拆分哺乳动物下的两个子类别) - 包含一个类别和下一类别(或文件结尾)之间的内容。另一种方法可能是从第一类别/文件开始到第二类别输出到文件,然后在重复之前自动/手动将其从原始文件中删除...

基本上,我想知道的是如何制作awksed输出两个标记之间的内容(此处为两个标记之间*)。

答案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

相关内容