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.
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.
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.
Eu acho que ed
não usa arquivos temporários, então
ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT
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 .
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.