首页 > 解决方案 > 按包含特定字符的行将大文本文件拆分为块

问题描述

我正在尝试将一个大文本文件(~27 Gb)分块成一系列较小的文件,其中断点由一个子标题定义,每个子标题都包含相同的符号(在本例中为“@”)。

所以下面的大文件:

@auniquestring
dataline1
dataline2
...
dataline33456
@aseconduniquestring
dataline33458
dataline33459
...
dataline124589
@athirdunqiuestring
dataline124591
dataline124592
...

...变成:

第一个文件:

@auniquestring
dataline1
dataline2
...
dataline33456

第二个文件:

@aseconduniquestring
dataline33458
dataline33459
...
dataline124589

第三个文件:

@athirdunqiuestring
dataline124591
dataline124592
...

ETC

我已经尝试过类似的东西,sed -n '/@/,/@/p' myfile但它会立即输出所有内容,并且错过了所有其他子标题的内容。任何帮助将非常感激

标签: bash

解决方案


使用 awk(注意它会创建 NAMED 文件file[0-9]+.txt):

$ awk '
BEGIN {
    file="file0.txt"               # just in case
}
/^@/ {                             # when record starts with @
    close(file)                    # close previous file
    file=sprintf("file%d.txt",++f) # generate next filename
}
{
    print > file                   # output to generated filename
}' file

样本输出:

$ cat file1.txt
@auniquestring
dataline1
dataline2
...
dataline33456

推荐阅读