classifica parte de um arquivo

6

Como posso classificar o arquivo pela segunda coluna do terminal. O conteúdo do arquivo é:

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

Usar sort -t' ' -nk2 não está me dando o resultado correto. Além disso, como posso garantir que o conteúdo do arquivo fique classificado?

    
por Gilles 10.05.2013 / 16:44

3 respostas

7

Acho que o que você procura é algo assim:

Método 1: usando head & cauda

$ (head -n 2 sample.txt; tail -n +3 sample.txt | sort -t' ' -nk2) > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

Isso pega a primeira linha do arquivo de texto, depois coroa tudo depois das duas primeiras linhas, que depois são classificadas.

Método # 2: apenas usando a cabeça

$ (head -n 2; sort -t' ' -nk2) < sample.txt > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

Pega o arquivo de texto como entrada, exibe apenas a primeira linha, classifica o restante.

Normalmente, não é uma boa ideia editar arquivos no lugar. É possível, mas é melhor usar um arquivo intermediário.

Método # 3: Fazendo # 2 sem um arquivo intermediário

Roubando a ideia de @StephaneChazelas você poderia fazer o seguinte usando o "1 < >" notação para abrir um arquivo para leitura & escrevendo, e as melhorias que ele sugeriu com o comando sort .

$ (head -n 2; sort -nk2) < sample.txt 1<> sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20
    
por 10.05.2013 / 16:51
7

Para sobrescrever o arquivo, você pode fazer:

{
  head -n 2 &&
    sort -k2n
} < the-file.txt 1<> the-file.txt

Isso funciona porque sort leu sua entrada completamente antes de começar a escrever sua saída, então é bom escrever no arquivo do qual está lendo. Além disso, sua saída é do mesmo tamanho que sua entrada, portanto, não há necessidade de truncar o arquivo no final.

Observe que, se você usar -t' ' em vez do separador padrão, cada caractere de espaço na entrada criaria um novo campo, portanto, por exemplo, em:

 a 10
b  2

(com um espaço antes de a e 2 espaços após b ), -t' ' -nk2 (lembre-se -k2 é para do campo 2 ao fim da linha , enquanto -k2,2 é campo 2 somente ) compararia "a 10" a " 2" numericamente, enquanto -nk2 sozinho compararia " 10" a "  2" numericamente (e a comparação numérica ignorará espaços em branco à esquerda).

    
por 10.05.2013 / 17:21
0

Eu precisava classificar duas partes de um arquivo. Significativamente inspirado pelas outras respostas, aqui está uma resposta estendida:

arquivo.txt

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

Example
------------
Foo
bar
Baz

Results: Finished!

Várias seções podem ser encadeadas e classificadas ou não com opções variadas. Use cat como último passo para produzir qualquer trecho não classificado no final.

(head -n 2; head -n 4 | sort -nk2 ; head -n 3; head -n 3 | sort; cat ) < file.txt 1<> sorted.txt

sorted.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

Example
------------
bar
Baz
Foo

Results: Finished!
    
por 18.10.2018 / 08:45