我有一个巨大的文件,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
进行拆分,那么我将获得数千个拆分文件,因为这种模式会一次又一次地重复。
答案 0 :(得分:3)
使用sed
进行操作会非常困难,因为到目前为止,您还没有简单的方法来跟踪读取的字符。使用awk
:
BEGIN {
fileno = 1
}
{
size += length()
}
size > 100000 && /Inspecting/ {
fileno++
size = 0
}
{
print $0 > "out" fileno;
}
根据您的需要调整尺寸。 awk
可能在处理非常大的数字时遇到问题。因此,最好跟踪到目前为止读取的行数。