Eu tenho um arquivo muito grande (~ 400 GB) e preciso remover as duas últimas linhas dele. Eu tentei usar sed
, mas funcionou por horas antes de desistir. Existe uma maneira rápida de fazer isso, ou eu estou preso sed
?
linux
sed
text-manipulation
Russ Bradberry
fonte
fonte
head -n -2 file
Respostas:
Eu não tentei isso em um arquivo grande para ver o quão rápido é, mas deve ser bastante rápido.
Para usar o script para remover linhas do final de um arquivo:
Ele procura o final do arquivo, verifica se o último caractere é uma nova linha, depois lê cada caractere um de cada vez, retrocedendo até encontrar três novas linhas e truncar o arquivo logo após esse ponto. A alteração é feita no local.
Edit: Adicionei uma versão do Python 2.4 na parte inferior.
Aqui está uma versão do Python 2.5 / 2.6:
Aqui está uma versão do Python 3:
Aqui está uma versão do Python 2.4:
fonte
você pode tentar o GNU head
fonte
head: illegal line count -- -2
Eu vejo que meus sistemas Debian Squeeze / testing (mas não o Lenny / stable) incluem um comando "truncate" como parte do pacote "coreutils".
Com isso, você poderia simplesmente fazer algo como
para remover 160 bytes do final do arquivo (obviamente você precisa descobrir exatamente quantos caracteres você precisa remover).
fonte
dd
serão removidos ... Acho que um script simples fará isso (você precisa especificar o deslocamento da entrada para obter o último kilobyte fe e depois usá-lotail -2 | LANG= wc -c
ou sth assim).tail
também é eficiente para arquivos grandes - pode ser usadotail | wc -c
para calcular o número de bytes a serem aparados.O problema com o sed é que ele é um editor de fluxo - ele processará o arquivo inteiro, mesmo que você queira fazer modificações apenas no final. Então, não importa o quê, você está criando um novo arquivo de 400 GB, linha por linha. Qualquer editor que opere no arquivo inteiro provavelmente terá esse problema.
Se você souber o número de linhas, poderá usar
head
, mas novamente isso cria um novo arquivo em vez de alterar o existente. Você pode obter ganhos de velocidade com a simplicidade da ação, eu acho.Você pode ter mais sorte usando
split
para quebrar o arquivo em pedaços menores, editando o último e, em seguida, usando-oscat
para combiná-los novamente, mas não tenho certeza se será melhor. Eu usaria contagens de bytes em vez de linhas, caso contrário provavelmente não será mais rápido - você ainda estará criando um novo arquivo de 400 GB.fonte
Experimente o VIM ... Não tenho certeza se isso funcionará ou não, pois nunca o usei em um arquivo tão grande, mas o usei em arquivos maiores menores no passado, tente.
fonte
Que tipo de arquivo e em qual formato? Pode ser mais fácil usar algo como Perl, dependendo do tipo de arquivo - texto, gráficos, binário? Como é formatado - CSV, TSV ...
fonte
Se você sabe o tamanho do arquivo no byte (digamos 400000000160) e sabe que precisa remover exatamente 160 caracteres para remover as duas últimas linhas, algo como
deve fazer o truque. Já faz muito tempo desde que eu usei dd com raiva; Parece que lembro que as coisas ficam mais rápidas se você usar um tamanho de bloco maior, mas se você pode fazer isso depende se as linhas que você deseja soltar estão em um bom múltiplo.
O dd tem outras opções para preencher os registros de texto em um tamanho fixo, o que pode ser útil como passe preliminar.
fonte
Se o comando "truncar" não estiver disponível no seu sistema (veja minha outra resposta), consulte o "man 2 truncar" da chamada do sistema para truncar um arquivo com um comprimento especificado.
Obviamente, você precisa saber quantos caracteres precisa truncar o arquivo (tamanho menos o comprimento do problema em duas linhas; não se esqueça de contar caracteres cr / lf).
E faça um backup do arquivo antes de tentar isso!
fonte
Se você preferir soluções no estilo unix, poderá ter truncamento de linha interativo e salvo usando três linhas de código (Testado no Mac e Linux).
pequeno + truncamento de linha no estilo unix seguro (solicita confirmação):
Essa solução conta com algumas ferramentas unix comuns, mas ainda é usada
perl -e "truncate(file,length)"
como substituta mais próximatruncate(1)
, o que não está disponível em todos os sistemas.Você também pode usar o seguinte programa abrangente de shell reutilizável, que fornece informações de uso e apresenta confirmação de truncamento, análise de opções e tratamento de erros.
script de truncamento de linha abrangente :
Aqui está um exemplo de uso:
fonte
mudanças são feitas no local. Isso é mais simples e mais eficiente que o script python.
fonte
ed
demorou 100 vezes mais tempo para ser executado do que o meu script Python. Posso apenas imaginar quanto mais a diferença seria para o arquivo do OP, que é 7000 vezes maior.Modificou a resposta aceita para resolver um problema semelhante. Pode ser ajustado um pouco para remover n linhas.
E o teste correspondente:
fonte
Você pode usar o Vim no modo Ex:
-,
selecione as últimas 2 linhasd
excluirx
salvar e fecharfonte