classificando um arquivo usando o comando sort e sobrescrevendo-o

3

Eu estava tentando classificar um arquivo de texto e substituir o arquivo classificado pelo original, então eu configurei o arquivo para ser também a saída do comando sort também, mas quando eu faço isso, ele limpa o conteúdo do arquivo e o arquivo fica vazio, por quê? Eu posso usar outro arquivo para resolver este problema, mas não me sinto bem: D, (e eu estou usando Lubuntu.)

faav@faav-XPS-L501X:~$ cat test
A
C
B
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 6 Apr 14 00:28 test
faav@faav-XPS-L501X:~$ sort test > test
faav@faav-XPS-L501X:~$ cat test
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 0 Apr 14 00:28 test
    
por favarjooy86 13.04.2015 / 22:01

3 respostas

5

Use a opção -o de sort em vez de usar o operador de redirecionamento, isso irá editar o arquivo no lugar.

Em man sort :

-o, --output=FILE
              write result to FILE instead of standard output

Aqui está um teste:

$ cat test.txt 
A
C
B

$ sort test.txt 
A
B
C

$ sort test.txt -o test.txt

$ cat test.txt 
A
B
C
    
por heemayl 13.04.2015 / 22:07
0

Isso acontece porque o arquivo de entrada / saída é truncado antes que seu conteúdo seja realmente lido, portanto sort acaba lendo um arquivo já vazio.

Em geral (isto é, ao redirecionar a saída de um comando para seu arquivo de entrada, já que esse problema não ocorre apenas com sort ), você pode executar o comando necessário dentro de uma subshell e armazenar sua saída em uma variável, em seguida, libere o conteúdo da variável para o arquivo (por exemplo, com echo ), desta forma atrasando o truncamento do arquivo de entrada / saída para um ponto em que o arquivo de entrada já foi lido:

tmp=$(sort test) && echo "$tmp" >  test

Observe também que isso não é muito eficiente para arquivos grandes, e que o operador && foi escolhido no lugar de ; para evitar o truncamento do arquivo de entrada / saída em caso de falha do primeiro comando .

    
por kos 13.04.2015 / 22:19
-1

Você pode escrever como sort -b -o filename nome_do_arquivo , em que filename especifica o mesmo arquivo duas vezes que você deseja que a saída seja salva ou sobrescreva no arquivo original. Esse comando funciona como, ele deve remover qualquer espaço em branco e ordenar o conteúdo do arquivo e sobrescrever no arquivo original.

Depois, você pode imprimir o conteúdo do arquivo mencionando cat filename , para imprimir o conteúdo do arquivo como saída no dispositivo de saída padrão.

Obrigado.

    
por ShrutiM 30.10.2017 / 16:15

Tags