Existe alguma maneira curta de salvar a saída do tubo no mesmo arquivo processado. Por exemplo, é isso que estou realmente fazendo
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Eu queria saber se havia uma maneira de fazê-lo em apenas uma linha (não anexando esses comandos usando &&)
Este não é o caminho, mas para ter uma idéia
$ cat filename | sort | uniq > filename
command-line
bash
whitenoisedb
fonte
fonte
echo $(cat filename | sort | uniq > result) > filename
ou alguma coisa ? Só de passagem, não tenho tempo para tentar.Respostas:
Você pode usar
sponge
a partir moreutils pacote:Você também não precisa canalizar
uniq
, pois quandosort
tem-u
opção para linhas exclusivas ao classificar.Observe que no sistema GNU com localidades UTF-8,
sort -u
ousort | uniq
não, você forneceu linhas únicas, mas a primeira da sequência de linhas que são iguais na localidade atual.te deu apenas
①
. Alterar a localidade para C força a ordem de classificação com base nos valores de bytes:fonte
Você não precisa de nenhum comando extra como
cat
euniq
também sem usar orm
comando e omv
comando para remover e renomear o nome do arquivo. basta usar o comando simples.Como isso funciona?
sort
O comando ordena seu nome de arquivo e, com a-u
opção, remove linhas duplicadas dele. em seguida, com a-o
opção grava a saída no mesmo arquivo com o método no local.fonte
sort
estiver em execução, você perderá o arquivo original.Seu exemplo sugerido (abaixo) não funciona porque você realmente está lendo e gravando no mesmo arquivo simultaneamente.
A idéia com um canal ou redirecionamento é que o comando no lado esquerdo e direito de cada canal ou redirecionamento seja executado simultaneamente, em paralelo. O comando à direita processa as informações conforme são entregues a partir do comando à esquerda, enquanto o comando à esquerda ainda está em execução.
Para que seu cenário funcione, o comando que lê do arquivo precisaria ser concluído antes que o comando que grava no arquivo seja iniciado. Para que isso funcione, você precisará redirecionar a saída para um local temporário primeiro e, depois que terminar, envie-o do local temporário de volta para o arquivo.
Uma maneira melhor de fazer isso é basicamente como no exemplo anterior, em que você redireciona para um arquivo temporário e depois renomeia esse arquivo para o original (exceto que você não precisa excluir o arquivo primeiro, porque a movimentação exclui qualquer destino existente) .
Você também pode salvá-lo em uma variável de sequência, exceto que só funciona quando os dados são pequenos o suficiente para caberem na memória de uma só vez.
fonte
cat filename | sort
para apenassort filename
-cat
é desnecessário aqui.cat
poderia ser desnecessário neste caso, mas eu estava focando na parte de redirecionamento.Você pode usar o
tee
comando:O
tee
comando lê da entrada padrão e grava na saída e nos arquivos padrão .fonte
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
funciona. Como o post original, isso não funciona se você apenas> ~/file
sem otee
. Tee parece semelhante aquisort -o file
, que grava no arquivo nomeado sem continuar o mesmo canal.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
Eu recomendo um arquivo temporário e /mv
ou talvez a solução do link do @ Steven.Você pode usar o Vim no modo Ex:
sort u
classificar únicox
escreva se as alterações foram feitas (elas têm) e saiafonte