假设我有一个格式如下的文件。
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
中是否有更短的方法来实现它。
答案 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
无论您的输入文件是否按前缀排序,此行都有效。