在unix中根据大小和模式分割大文件

New*_*bie 1 linux split sed

我有一个巨大的文件,45 GB。我想把它分成4部分。我可以通过以下方式做到这一点split --bytes=12G inputfile

问题是它扰乱了文件的模式。此拆分根据大小剪切文件,因此不会保留格式。我的输入文件如下所示:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
Run Code Online (Sandbox Code Playgroud)

我想分割文件,但也要提到分割它的模式,Inspecting以便我返回的分割文件必须如下所示:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
 V$ARNT_Q6_01           |      390 (+) |  1.000 |  0.998 | tACGTGgc
Run Code Online (Sandbox Code Playgroud)

和这个:

Inspecting sequence ID   chr1:11873-13873

 V$ARID3A_04            |     1981 (-) |  0.899 |  0.774 | tttctatAATAActaaa
 V$ARID3A_04            |     1982 (+) |  0.899 |  0.767 | ttctaTAATAactaaag
 V$ARNT_Q6_01           |      390 (+) |  1.000 |  0.998 | tACGTGgc
Run Code Online (Sandbox Code Playgroud)

NOTE:这种图案匹配应该是第二优先选择,而第一优先应该是尺寸。例如,将文件拆分为 12 GB 的块,并根据Inspecting. 如果我仅根据模式进行拆分Inspecting,那么我将获得数千个拆分文件,因为此模式会一次又一次重复。

Mic*_*hrs 5

用它来做sed会非常困难,因为你没有简单的方法来跟踪到目前为止所读取的字符。使用以下命令会更容易awk

BEGIN {
    fileno = 1
}
{
    size += length()
}
size > 100000 && /Inspecting/ {
    fileno++
    size = 0
}
{
    print $0 > "out" fileno;
}
Run Code Online (Sandbox Code Playgroud)

根据您的需要调整大小。awk处理非常大的数字可能会出现问题。因此,最好跟踪到目前为止已读取的行数。