0

假设我有一个格式如下的文件。

prefix1: line 1
prefix1: line 2
prefix1: line 3
prefix2: line 4

prefix2: line 5
prefix3: line 6

prefix3: line 7
prefix3: line 8
prefix3: line 9
prefix3: line 10

我想将其拆分为三个文件,名称分别为prefix1, prefix2, prefix3, 换行符作为完全包含它们的文件的一部分。

在真实文件中,可能有n前缀,而不仅仅是 3。

我可以编写一个 python 脚本来直接实现该功能,但我想知道在awk.

4

1 回答 1

3

这个单线适用于这项工作:

 awk -F: '{f=$1?$1:f; print > f}' file

用你的例子:

kent$  cat file
prefix1: line 1
prefix1: line 2
prefix1: line 3
prefix2: line 4

prefix2: line 5
prefix3: line 6

prefix3: line 7
prefix3: line 8
prefix3: line 9
prefix3: line 10

kent$  awk -F: '{f=$1?$1:f; print > f}' file

kent$  head prefix*
==> prefix1 <==
prefix1: line 1
prefix1: line 2
prefix1: line 3

==> prefix2 <==
prefix2: line 4

prefix2: line 5

==> prefix3 <==
prefix3: line 6

prefix3: line 7
prefix3: line 8
prefix3: line 9
prefix3: line 10

你提到了n 个前缀。如果 N 足够大,上面的 awk 行可能会失败,例如“打开了太多文件”。为了解决这个问题,我们可以在写入/追加文本后关闭文件。

也就是说,该行可能是:

awk -F: '{f=$1?$1:f; print >> f; close(f)}' file

无论您的输入文件是否按前缀排序,此行都有效。

于 2013-04-17T22:24:17.177 回答