Dividir um arquivo de texto grande a cada repetição do padrão x

2

Estou tentando dividir um arquivo grande a cada padrão de x sem sucesso, como posso conseguir isso?

A estrutura do arquivo:

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QWERT ASJDHASDJHASDHASDHASJDHAJDHJHAD

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> QTRE AGAHDSJHDASJDHASJDHASJHDAJSDHJASHDJASHDJASHJDHASJDHASJDHAJSHDASJHDJASHDJASHDJASHDJASHDJASJDASHDSUHQYWGEYWGYWGQYWDWBCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTS

> ASDF ABCDEFGHIJKWERQWEWQYASTRDTAYDGAHSFDTSASHDJASHDJASDHAJSDHAJDHQUHWUDHUHAWUHASUDHUASDHSUDHSU

Tem milhares de linhas com diferentes comprimentos e várias linhas por ">" cabeçalho. Quero dividir esse arquivo grande em filtragem menor a cada 100 ">" cabeçalhos por arquivo, é possível fazer isso?

Obrigado antecipadamente!

    
por Rycerzfrost 18.01.2016 / 17:29

2 respostas

1

Aqui está um pequeno script em perl para você. Você pode salvá-lo como split_files.pl e executá-lo como perl split_files.pl input.txt . A saída será armazenada em arquivos chamados chunk_0 , chunk_1 etc.

#!/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 $!;

Explicação:
O truque do script é a linha $/="\n>"; . Essa linha altera o caractere de quebra de linha padrão ( \n ) para "newline + >" (%código%). No laço while, cada bloco começando com ">" é usado de uma só vez. Eu usei duas variáveis de contagem ( \n> e $linecount ). As linhas (ou blocos neste caso) são contadas e quando essa contagem atinge 100, um novo arquivo é usado para a saída.

    
por Wayne_Yux 19.01.2016 / 00:04
0

abordagem Python

O script abaixo divide o nome do arquivo dado na linha de comando nos arquivos, uma vez que um número específico de > caracteres foi visto no início de uma linha. O número de caracteres vistos também é especificado na linha de comando. Assim, a sintaxe é a seguinte:

$ ./split_file.py input.txt 3

Fonte de script

#!/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()

Nota: o script é escrito para o Python 2, mas é compatível com o Python 3. Pode ser facilmente modificado para dividir com base em uma cadeia inicial variável.

    
por Sergiy Kolodyazhnyy 03.02.2017 / 19:17

Tags