如何将文件拆分为由关键字定义的块

Lee*_*nde 4 bash

假设我有一个大文本文件,例如:

variableStep chrom=chr1
sometext1
sometext1
sometext1
variableStep chrom=chr2
sometext2
variableStep chrom=chr3
sometext3
sometext3
sometext3
sometext3
Run Code Online (Sandbox Code Playgroud)

我想将此文件拆分为 3 个文件:文件 1 包含内容

sometext1
sometext1
sometext2
Run Code Online (Sandbox Code Playgroud)

文件 2 有内容

sometext2
Run Code Online (Sandbox Code Playgroud)

和文件 3 有内容

sometext3
sometext3
sometext3
sometext3
Run Code Online (Sandbox Code Playgroud)

请注意,“sometext1”、“sometext2”、“sometext3”都没有“variableStep”一词。

我可以在 python 中通过简单地迭代这些行并打开一个新的文件句柄并在每次我在行的开头遇到“variableStep”时将后续行写入它来做到这一点,但是,我想知道这是否可以在命令行。请注意,真实文件很大(多个 Gb,因此一次性读取所有内容是不可行的)。

谢谢

Joh*_*024 5

这将创造file1file2等与所需的内容:

awk '/variableStep/{close(f); f="file" ++c;next} {print>f;}' file
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • /variableStep/{close(f); f="file" ++c;next}

    每次到达包含 的行时variableStep,我们关闭最后使用的文件,指定f下一个要使用的文件的名称,然后跳过其余命令并跳转到下一行。

    c是一个计数器,告诉我们当前文件的编号。++每次我们创建一个新文件名时它都会增加。

  • print>f

    对于所有其他行,我们将它们打印到根据变量值命名的文件中f

由于这是逐行处理文件,因此即使是海量文件,它也应该适用。

第一个输出文件如下所示:

$ cat file1
sometext1
sometext1
sometext1
Run Code Online (Sandbox Code Playgroud)