A sort
precisa ver todas as entradas antes de começar a produzir. Por esse motivo, o sort
programa pode facilmente oferecer uma opção para modificar um arquivo no local:
sort temp.txt -o temp.txt
Especificamente, a documentação do GNUsort
diz:
Normalmente, o sort lê todas as entradas antes de abrir o arquivo de saída, para que você possa classificar um arquivo com segurança usando comandos como sort -o F F
e cat F | sort -o F
. No entanto, sort
with --merge
( -m
) pode abrir o arquivo de saída antes de ler todas as entradas, portanto, um comando como cat F | sort -m -o F - G
não é seguro, pois sort pode começar a escrever F
antes de cat
terminar de lê-lo.
Enquanto a documentação do BSD sort
diz:
Se [o] arquivo de saída for um dos arquivos de entrada, sort o copia para um arquivo temporário antes de classificar e gravar a saída em [o] arquivo de saída.
Comandos como uniq
podem começar a gravar a saída antes de terminarem de ler a entrada. Normalmente, esses comandos não oferecem suporte à edição local (e seria mais difícil para eles oferecer suporte a esse recurso).
Normalmente, você contorna isso com um arquivo temporário ou, se deseja absolutamente evitar um arquivo intermediário, pode usar um buffer para armazenar o resultado completo antes de gravá-lo. Por exemplo, com perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Aqui, a parte perl lê a saída completa da uniq
variável $_
e sobrescreve o arquivo original com esses dados. Você pode fazer o mesmo na linguagem de script de sua escolha, talvez até mesmo no Bash. Mas observe que será necessária memória suficiente para armazenar o arquivo inteiro, isso não é aconselhável ao trabalhar com arquivos grandes.