Linux unix中基于大小和模式的大文件拆分

Linux unix中基于大小和模式的大文件拆分,linux,sed,split,Linux,Sed,Split,我有一个45 GB的大文件。我想把它分成四部分。我可以这样做:split--bytes=12G inputfile 问题是它扰乱了文件的模式。此拆分会根据大小剪切文件,因此不会保留格式。我的输入文件如下所示: Inspecting sequence ID chr1:11873-13873 V$ARID3A_04 | 1981 (-) | 0.899 | 0.774 | tttctatAATAActaaa V$ARID3A_04 |

我有一个45 GB的大文件。我想把它分成四部分。我可以这样做:
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 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
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
 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

注意:
此模式匹配应该是第二个首选项,而第一个应该是大小。例如,将文件拆分为12 GB的chunck,并根据
检查的模式匹配进行拆分。如果我仅仅根据模式
检查
进行分割,那么我将得到数千个分割的文件,因为这个模式会一次又一次地重复

使用
sed
将非常困难,因为到目前为止,您没有简单的方法来跟踪读取的字符。使用awk将更容易:

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

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

使用
sed
执行此操作将非常困难,因为您没有简单的方法来记录到目前为止读取的字符。使用awk将更容易:

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

根据需要调整尺寸
awk
可能在处理非常大的数字时遇到问题。出于这个原因,最好记录到目前为止读取的行数。

您能解释一下,如果100000是要读取的行数,那么在下一次“检查”时,请将其打断,然后它将成为下一个输出文件的一部分吗?其次,fileno是这里的输入文件名吗?
fileno
是输出文件名的一部分,大小是以字符而不是行计算的。它将所有输入行的字符串长度相加。您在哪里读取输入文件?对不起,我太天真了,我是linux操作系统的新手,也许我误解了你的意图。。。?我不使用
split
。我直接分割原始文件。我希望原始文件保持完整(大小45 GB),然后制作4个12 GB的新块。我想我可以通过
awk-f process.awk inputFile.txt>outputFile.txt
来完成。如果process.awk包含您上面提到的代码,我说的对吗?您能解释一下100000是否是要读取的行数,然后在下一次“检查”时将其打断,然后它将成为下一个输出文件的一部分吗?其次,fileno是这里的输入文件名吗?
fileno
是输出文件名的一部分,大小是以字符而不是行计算的。它将所有输入行的字符串长度相加。您在哪里读取输入文件?对不起,我太天真了,我是linux操作系统的新手,也许我误解了你的意图。。。?我不使用
split
。我直接分割原始文件。我希望原始文件保持完整(大小45 GB),然后制作4个12 GB的新块。我想我可以通过
awk-f process.awk inputFile.txt>outputFile.txt
来完成。process.awk包含您上面提到的代码,对吗?