Разделение большого текстового файла повторяет каждый шаблон x

Я пытаюсь разбить большой файл каждые x образцов безуспешно, как я могу этого добиться?

Структура файла:

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBDEFWDWDWD

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU

Он содержит тысячи строк разной длины и несколько строк на заголовок ">". Я хочу разделить этот большой файл на меньшую фильтрацию каждые 100 ">" заголовков на файл, это возможно сделать?

Заранее спасибо!

2 ответа

Решение

Вот небольшой Perl-скрипт для вас. Вы можете сохранить его как split_files.pl и запустить его как perl split_files.pl input.txt, Вывод будет сохранен в файлах, называемых chunk_0, chunk_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, для вывода используется новый файл.

Подход 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. Может быть легко изменен для разделения на основе переменной стартовой строки.

Другие вопросы по тегам