Estou com um problema ao visualizar blocos de um arquivo de texto muito grande. Esse arquivo, aproximadamente 19 GB, é obviamente grande demais para ser visualizado por qualquer meio tradicional.
Eu tentei head 1
e tail 1
( head -n 1
e tail -n 1
) com os dois comandos reunidos de várias maneiras (para chegar a um pedaço no meio) sem sorte. Minha máquina Linux executando o Ubuntu 9.10 não pode processar este arquivo.
Como eu manejo esse arquivo? Meu objetivo final é aprimorar as linhas 45000000 e 45000100.
split
facilitar o trabalho do arquivo grande.dd
para obter a parte que procura . Por exemplodd if=bigfile of=extractfile bs=1M skip=10240 count=5
, extrairá 5 MB do arquivo a partir do ponto de 10 GB.Respostas:
Você deveria usar
sed
.Isso indica
sed
para imprimir as linhas 45000000-45000100 inclusive e sair na linha 45000101.fonte
tail+|head
é mais rápido em 10-15%.Crie um banco de dados MySQL com uma única tabela que possui um único campo. Em seguida, importe seu arquivo para o banco de dados. Isso tornará muito fácil procurar uma determinada linha.
Acho que nada mais poderia ser mais rápido (se
head
etail
já falhar). No final, o aplicativo que deseja localizar a linhan
deve procurar por todo o arquivo até encontrarn
novas linhas. Sem algum tipo de pesquisa (deslocamento do índice de linha para byte no arquivo), não é possível obter melhor desempenho.Dado o quão fácil é criar um banco de dados MySQL e importar dados para ele, sinto que essa é uma abordagem viável.
Aqui está como fazê-lo:
/tmp/my_large_file
seria o arquivo que você deseja ler.A sintaxe correta para importar um arquivo com valores delimitados por tabulação em cada linha é:
Outra grande vantagem disso é que, se você decidir posteriormente extrair outro conjunto de linhas, não precisará esperar horas pelo processamento novamente (a menos que exclua o banco de dados, é claro).
fonte
sed
comando abaixo e identifiquei minhas linhas. Mas agora tenho uma pergunta de acompanhamento para a qual o método de banco de dados pode ser mais adequado. Agora preciso excluir algumas centenas de linhas do arquivo.sed
poderia fazer isso também. Obviamente, se você tivesse os dados no banco de dados, seria trivial exportar um novo arquivo com apenas as linhas desejadas.sed
resposta (porque isso me deu um prazer mais imediato; -), mas lhe dei uma votação positiva, porque usarei seu método no futuro. Eu agradeço.FIELDS TERMINATED BY '\n'
àLOAD DATA
linha.Duas boas ferramentas antigas para arquivos grandes são
join
esplit
. Você pode usar o split com a--lines=<number>
opção de cortar arquivos em vários arquivos de determinado tamanho.Por exemplo
split --lines=45000000 huge_file.txt
. As partes resultantes estariam em xa, xb, etc. Em seguida, você podehead
a parte xb que incluirá as linhas que você deseja. Você também pode 'ingressar' nos arquivos novamente para um único arquivo grande.fonte
Você tem as ferramentas certas, mas as está usando incorretamente. Como respondido anteriormente na U&L,
tail -n +X file | head -n Y
(observe+
) é 10-15% mais rápido do quesed
nas linhas Y começando em X. E, convenientemente, você não precisa explicitamenteexit
o processo como no casosed
.fonte