Como dividir o texto do pipeline em N arquivos de tamanho igual?

1

Eu quero canalizar um fluxo para split . Eu sei o quão grande será o fluxo em bytes (muito grande, vem da rede), eu quero dividir para criar N arquivos de tamanho relativamente igual, sem dividir as linhas ao meio. É possível conseguir isso? Algo como:

cat STREAM | split $SIZE_OF_STREAM $NUMBER_OF_FILES_TO_PRODUCE

Não consegui encontrar uma maneira de conseguir isso por meio de documentos, desculpe se era óbvio, mas não consegui encontrá-lo.

    
por ddinchev 05.12.2012 / 09:10

3 respostas

1

Ah, bem, parece que o utilitário split no Mac (e talvez o BSD) é uma opção curta: (

No Linux, existe a opção -C , que permite dizer que cada pedaço de linhas deve ter quantos bytes. Ou dito de maneira mais simples - se você passar cat file | split -C 1000 , ele criará pedaços de até 1000 bytes de linhas inteiras, o que, com a matemática elementar, me oferece uma maneira fácil de alcançar o que eu queria.

    
por 05.12.2012 / 09:31
0

Eu simplesmente divisão on-line conte como isso fará com que todos os arquivos, exceto o último, sejam quase iguais.

export LINE_COUNT=100,000
cat $STREAM | split -l $LINE_COUNT

Você poderia fazer as contas com $ SIZE_OF_STREAM dividido por $ NUMBER_OF_FILES_TO_PRODUCE, mas apenas definir uma contagem de linhas significa 90% do caminho para ter todos os arquivos basicamente iguais, a menos que o tamanho da sua linha seja distribuído de uma maneira não normal. / p>

Vinculei-me à documentação on-line, mas as páginas do manual são enviadas com o OS X para que você possa ver que a divisão tem um corte de bytes e um limite de linha.

    
por 05.12.2012 / 16:25
0

crie um arquivo que esteja fora de STREAM:

echo "1234\n5678" > xfile

agora será dividido

for i in $(seq 0..'wc -c xfile|awk '{print $1}''); do let a='expr $i \* 2'; dd if=xfile of=file$i bs=1 count=2 skip=$a; done

ele lhe dará um registro dos arquivos com 2 bytes de tamanho fixo e os nomes file1, file2, file3 ....

    
por 05.12.2012 / 09:36

Tags