Divide um arquivo de texto em vários arquivos, além do limite {99} do csplit

2

Gostaria de dividir o conteúdo de um arquivo .txt em vários arquivos, mas estou encontrando duas perguntas sobre as limitações do csplit:

(1) alguém pode oferecer uma maneira de contornar o limite máximo de splits de arquivo '99' do csplit? Eu tenho um arquivo com até 384 divisões com base em uma linha ou caractere em branco recorrente. Eu gostaria que o csplit fosse capaz de acomodar isso com {*}, mas isso excede a capacidade de geração de arquivos intrínseca do csplit.

(2) alguém sabe de uma maneira de passar o conteúdo de um arquivo para csplit (pipe para csplit), ou o csplit só pode ser usado em seu modo convencional de chamar um arquivo? ou seja, csplit -f split_name file_to_split.txt /split/ {*} vs. [series of commands] | csplit -f split_name /split/ {*}

Obrigado por quaisquer sugestões ou alternativas para realizar uma tarefa semelhante.

    
por kehmsen 25.03.2016 / 23:42

1 resposta

5

Como Michael Homer comenta , qualquer csplit compatível com POSIX pode ter mais de 99 arquivos, mas você precisa passar a opção -n .

csplit -n 3 file_to_split.txt
Dito isto, se você tem uma tarefa que pode ser feita facilmente com a versão GNU do csplit mas não com a versão FreeBSD / OSX, você pode instalar a versão GNU (parte do GNU coreutils). Coreutils GNU podem ser instalados através de várias fontes, acho que o mais popular é o homebrew . Veja também Como substituir o Mac OS X utilitários com utilitários principais GNU? .

Como alternativa, a maior parte do csplit pode ser implementada em algumas linhas do awk, e isso oferece mais flexibilidade em termos de coisas como o nome do arquivo de saída. O snippet a seguir lê a entrada padrão e grava linhas em part-000.txt , part-001.txt , etc., alterando arquivos toda vez que uma linha contém header-line .

awk '
    /header-line/ {
        ++part;
        if (output_file) close(output_file);
        output_file=snprintf("part-%03d.txt", part)
    }
    {print >file}
'
    
por 26.03.2016 / 01:23

Tags