如何根据行开头模式将文本文件拆分为多个文件?

如何根据行开头模式将文本文件拆分为多个文件?

我有一些文本文件,我想根据我放在各行开头的任意“标签”将其分成不同的文件。

文本文件示例:

I CELEBRATE myself, and sing myself,  
And what I assume you shall assume, 
For every atom belonging to me as good belongs to you.

#here I loafe and invite my soul, 
#here I lean and loafe at my ease observing a spear of summer grass.

#there My tongue, every atom of my blood, form'd from this soil, this air,
#there Born here of parents born here from parents the same, and their parents the same, 
#here I, now thirty-seven years old in perfect health begin, 
#here Hoping to cease not till death.

在此示例中,我想删除以 开头的每一行#here并将其附加到名为 的文件中here.txt,以 开头的每一行附加#there到名为 的文件中there.txt,并将每个未标记的行保留在原始文件中。 (最好#here #there在此过程中删除标签。)

我认为这个解决方案使用awk可能会有帮助,但我是一个 Unix 菜鸟,我不知道如何适应我的问题:如何使用关键字边界分割文件

关于如何继续的任何建议?

PS:我在 OS X 上使用命令行。

答案1

您的案例比链接的案例更简单 - 您只需要查看每一行(或 awk 术语中的“记录”)并决定将其发送到哪里。所以:

awk '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt

其余行将打印到标准输出;可移植的是,您可以将其重定向到第三个文件(rest.txt例如),然后将其重命名为原始文件的名称。如果你有GNU awk,则可以使用该inplace模块直接修改原始文件:

gawk -i inplace '/^#here/{print > "here.txt"; next} /^#there/{print > "there.txt"; next} {print}' input.txt

答案2

使用sed w命令:

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' data

要保留不以所需模式开头的行:

sed -n -e '/^#here/w here.txt' -e '/^#there/w there.txt' -e '/^$/d;' -e '/^#/!w new_data.txt' data

sed会将匹配应用于该行并将其写入相应的文件。

如果该行未标记 ( /^#/!),且不为空 ( /^$/),则将该行写入名为 的文件new_data.txt,该文件包含所有未标记的行。

如果您想保留空行,请-e /^$/d;从命令行中删除 。

相关内容