这个单线适用于这项工作:
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
无论您的输入文件是否按前缀排序,此行都有效。