根据大小和模式拆分unix中的大文件

时间:2017-03-08 12:11:43

标签: linux sed split

我有一个巨大的文件,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

我想拆分文件,但也提到将它拆分为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

和此:

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

NOTE:此模式匹配应该是第二个首选项,而第一个应该是大小。例如,将文件拆分为12 GB的块,并根据Inspecting的模式匹配进行拆分。如果我只根据模式Inspecting进行拆分,那么我将获得数千个拆分文件,因为这种模式会一次又一次地重复。

1 个答案:

答案 0 :(得分:3)

使用sed进行操作会非常困难,因为到目前为止,您还没有简单的方法来跟踪读取的字符。使用awk

会更容易
BEGIN {
    fileno = 1
}
{
    size += length()
}
size > 100000 && /Inspecting/ {
    fileno++
    size = 0
}
{
    print $0 > "out" fileno;
}

根据您的需要调整尺寸。 awk可能在处理非常大的数字时遇到问题。因此,最好跟踪到目前为止读取的行数。