我有一个巨大的文件,45 GB。 我想把它分成4个部分。 我可以做到这一点: split --bytes=12G inputfile
。
问题是它扰乱了文件的模式。 这个拆分基于大小的文件,所以格式不被保留。 我的input文件如下所示:
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
那么我将得到数以千计的分割文件,因为这种模式一再重复。
用sed
做它会很困难,因为你没有简单的方法来跟踪到目前为止读取的字符。 awk
会更容易:
BEGIN { fileno = 1 } { size += length() } size > 100000 && /Inspecting/ { fileno++ size = 0 } { print $0 > "out" fileno; }
根据您的需要调整大小。 awk
可能在处理非常大的数字时遇到问题。 由于这个原因,跟踪目前阅读的行数可能会更好。