Eu tenho um grande arquivo de texto simples (por número de linhas) que gostaria de dividir em arquivos menores, também por número de linhas. Portanto, se meu arquivo tiver cerca de 2 milhões de linhas, gostaria de dividi-lo em 10 arquivos que contêm 200k linhas ou 100 arquivos que contêm 20k linhas (mais um arquivo com o restante; ser igualmente divisível não importa).
Eu poderia fazer isso facilmente no Python, mas gostaria de saber se existe algum tipo de maneira ninja de fazer isso usando utilitários bash e unix (em oposição a loop manual e linhas de contagem / particionamento).
cat part* > original
Respostas:
Você já olhou para o comando split?
Você poderia fazer algo assim:
que criará arquivos cada um com 200000 linhas nomeadas
xaa xab xac
...Outra opção, dividida por tamanho do arquivo de saída (ainda divide em quebras de linha):
cria arquivos como
output_prefix01 output_prefix02 output_prefix03 ...
cada um com tamanho máximo de 20 megabytes.fonte
split -b 200m filename
(m para megabytes, k para kilobytes ou nenhum sufixo de bytes)-d
opção não está disponível no OSX, use em seugsplit
lugar. Espero que isso seja útil para usuários de Mac.E o comando split ?
fonte
Sim, existe um
split
comando. Ele dividirá um arquivo por linhas ou bytes.fonte
split -l 1000000 train_file train_file.
e no mesmo diretório, recebereitrain_file.aa
o primeiro milhão, depoistrail_file.ab
o próximo milhão, etc.split input my/dir/
.usar
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
fonte
Usar:
Aqui, 1 e 100 são os números de linha nos quais você capturará
output.txt
.fonte
split
como todas as principais respostas aqui já lhe dizem.divida o arquivo "file.txt" em 10000 arquivos de linhas:
fonte
split
(do GNU coreutils, desde a versão 8.8 de 22-12-2010 ) inclui o seguinte parâmetro:Assim,
split -n 4 input output.
irá gerar quatro arquivos (output.a{a,b,c,d}
) com a mesma quantidade de bytes, mas as linhas podem ser quebradas no meio.Se queremos preservar linhas completas (isto é, dividir por linhas), isso deve funcionar:
Resposta relacionada: https://stackoverflow.com/a/19031247
fonte
Caso você queira apenas dividir por x número de linhas em cada arquivo, as respostas fornecidas
split
são válidas. Mas estou curioso para saber que ninguém prestou atenção nos requisitos:Não posso fazer isso sem "wc + cut", mas estou usando isso:
Isso pode ser facilmente adicionado às suas funções bashrc para que você possa invocá-lo passando o nome do arquivo e os pedaços:
Caso você queira apenas x pedaços sem restante no arquivo extra, basta adaptar a fórmula para somar (pedaços - 1) em cada arquivo. Eu uso essa abordagem, porque geralmente eu só quero x número de arquivos em vez de x linhas por arquivo:
Você pode adicionar isso a um script e chamá-lo de "jeito ninja", porque se nada atender às suas necessidades, você poderá construí-lo :-)
fonte
-n
opção desplit
.você também pode usar o awk
fonte
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
O HDFS obtém um arquivo pequeno e é derramado no tamanho da propriedade.
Este método causará quebra de linha
Eu tento ficar imenso e dividir em cerca de 128 MB cada arquivo.
fonte