Não há espaço em disco suficiente: remova as primeiras n linhas do arquivo de texto sem copiar o arquivo [duplicado]

2

Desejo remover as primeiras $rmv linhas de um arquivo de texto enorme chamado $filename . Este arquivo de texto é tão grande que não consigo colocar duas cópias dele no meu disco rígido.

O seguinte deixa-me com um arquivo em branco chamado $filename :

tail -n +$rmv "$filename" > "$filename" 

O seguinte não pode ser executado porque não tenho espaço de armazenamento para caber tanto em $filename quanto em $filename.tmp :

tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename"

Se for importante, estou usando o Mac OS X El Capitan.

    
por NewNameStat 29.03.2016 / 20:12

4 respostas

3

Se você tiver perl :

{
  tail -n +"$rmi"
  perl -e 'truncate STDOUT, tell STDOUT'
} <file 1<>file

Note que com essa abordagem, não há backup de arquivo, portanto, qualquer dano faz com que você perca seus dados.

    
por 29.03.2016 / 20:22
0

Eu acho que ed não usa arquivos temporários, então

ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT
    
por 29.03.2016 / 21:22
0

Para edições de arquivo com script, a ferramenta escolhida é ex .

ex -sc "1,${rmv}d | x" "$filename"

Você também pode pesquisar o split utility .

    
por 29.03.2016 / 21:25
0

Seu arquivo de texto é x MB, você não tem 2 * x MB, mas suponho que você não tenha espaço suficiente para compactar o arquivo também? Arquivos de texto costumam compactar até um décimo do tamanho original ...

Você não tem espaço suficiente para manter apenas as linhas ($ total- $ rmv), mas e se elas forem compactadas? tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"

Considerando isso como um problema intelectual abstrato, eu cortaria o arquivo em partes, dimensionadas para caber na memória ou no espaço disponível em disco, começando com o último trecho e depois truncando o arquivo original. Eu também poderia compactar o arquivo usando dd conv=notrunc trickery.

No entanto, na prática, eu também ou

  • copie o arquivo pela rede para um servidor com disco suficiente para armazenar (somente) as linhas ($ total- $ rmv), verifique se eu obtive as linhas corretas, removo o arquivo original e copio de volta.

  • adicione disco, pois obviamente você precisa dele.

por 29.03.2016 / 21:58