是否可以用awk
or做这样的事情sed
? ...或者我必须使用perl
or python
(或者我猜是 C++,因为那是我最舒服的)?
假设我有一个文件,其中包含类别和子类别中的项目列表:
* 鸟类 - 麻雀 - 喜鹊 - 乌鸦 - 鹦鹉 * 哺乳动物 * 宠物 - 狗 - 猫 - 兔子 * 害虫 - 垃圾熊猫 - 臭鼬 * 鱼 - 鳟鱼 - 鲱鱼 - 三文鱼 (...)
这应该分为三个文件 - 鸟类、哺乳动物和鱼类(不需要拆分哺乳动物下的两个子类别) - 包含一个类别和下一类别(或文件结尾)之间的内容。另一种方法可能是从第一类别/文件开始到第二类别输出到文件,然后在重复之前自动/手动将其从原始文件中删除...
基本上,我想知道的是如何制作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