按照重复的 x 模式拆分大型文本文件

按照重复的 x 模式拆分大型文本文件

我尝试按 x 种模式拆分一个大文件,但没有成功,我该如何实现?

文件结构:

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU

它有数千行不同长度的行,每个“>”标题有多行。我想将这个大文件拆分成更小的文件,每个文件每 100 个“>”标题进行过滤,可以做到吗?

提前致谢!

答案1

这是一个小的 perl 脚本。您可以将其另存为split_files.pl并以 运行perl split_files.pl input.txt。输出将存储在名为等的文件中chunk_0chunk_1

#!/usr/bin/perl                                                           
use strict;
use warnings;

my$infile=shift(@ARGV);

my$linecount=0;
my$filecount=0;
my$outfile="chunk_".$filecount;

open(IN,'<',$infile) or die $!;
open(OUT,'>',$outfile) or die $!;
$/="\n>";
while(<IN>)
{
    chomp;
    $_=~s/>//g;
    if($linecount==100)
    {
        $filecount++;
        $outfile="chunk_".$filecount;
        close OUT or die $!;
        open(OUT,'>',$outfile) or die $!;
        $linecount=0;
    }
    print OUT ">",$_,"\n";
    $linecount++;
}
close OUT or die $!;
close IN or die $!;

解释:
脚本的窍门在于行$/="\n>";。此行将默认换行符 ( \n) 更改为“换行符 + >” ( \n>)。在 while 循环中,每个以“>”开头的块都会被使用一次。我使用了两个计数变量($linecount$filecount)。对行(或本例中的块)进行计数,当计数达到 100 时,将使用新文件进行输出。

答案2

Python 方法

下面的脚本会在命令行中指定的文件名在行>首出现特定数量的字符后将其拆分为文件。命令行中还指定了可见字符的数量。因此语法如下:

$ ./split_file.py input.txt 3

脚本源

#!/usr/bin/env python
import sys

def write_split_file(count,orig_name,lines):
    split_name = orig_name + '.split.' + str(count)
    with open(split_name,'w') as fd:
       fd.write("\n".join(lines))

def main():
    counter = 0
    limit = int(sys.argv[2])
    line_list = []
    with open(sys.argv[1]) as fd1:
        for line in fd1:
            line_list.append(line.strip())
            if line.startswith('>'):
               counter+=1
               if counter % limit == 0:
                  write_split_file(counter,sys.argv[1],line_list)
                  line_list = []

    if line_list:          
       write_split_file(counter,sys.argv[1],line_list)

if __name__ == '__main__': main()

注意:该脚本是为 Python 2 编写的,但与 Python 3 兼容。可以轻松修改为基于变量起始字符串进行拆分。

相关内容