我有一些文本文件,我想根据我放在各行开头的任意“标签”将其分成不同的文件。
文本文件示例:
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;
从命令行中删除 。