根据公共行前缀将文件拆分为多个文件

时间:2013-04-17 22:17:37

标签: awk

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

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

我想将其拆分为三个名称为prefix1prefix2prefix3的文件,新行完整,作为完全包含它们的文件的一部分。

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

我可以编写一个python脚本来直接实现这个功能,但我想知道在awk中是否有更短的方法来实现它。

1 个答案:

答案 0 :(得分: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

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