Ordene os dados em ordem decrescente da primeira coluna, para valores iguais, use a segunda coluna em ordem crescente

22

Permita-me esclarecer:

Suponha que eu tenha algumas palavras-chave com frequência de uso:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

O que eu quero é classificar esses dados com base na frequência em ordem decrescente e, se houver alguns valores iguais, ele deve usar a segunda coluna em ordem crescente.

sort -n -r foo.txt

A primeira parte e depois a segunda coluna também são reversed :

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Como posso alcançar os seguintes resultados?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Acho que tenho que usar o argumento -k , mas não consigo descobrir como!

Eu quero saber como isso pode ser feito usando somente o comando sort de bash . No entanto, se não for possível alcançar isso apenas por sort , outros comandos devem ser compatíveis com o shell Bourne.

    
por Pouya 31.03.2014 / 13:41

1 resposta

32

Especifique as chaves de classificação separadamente com os critérios:

sort -k1,1nr -k2,2 inputfile

Isso especifica que a primeira chave é ordenada numericamente em ordem reversa, enquanto a segunda é classificada de acordo com a ordem de classificação padrão .

Citações de classificação POSIX :

-k keydef

The keydef argument is a restricted sort key field definition. The format of this definition is:

field_start[type][,field_end[type]]

where field_start and field_end define a key field restricted to a portion of the line (see the EXTENDED DESCRIPTION section), and type is a modifier from the list of characters 'b', 'd', 'f', 'i', 'n', 'r'. The 'b' modifier shall behave like the -b option, but shall apply only to the field_start or field_end to which it is attached. The other modifiers shall behave like the corresponding options, but shall apply only to the key field to which they are attached; they shall have this effect if specified with field_start, field_end, or both. If any modifier is attached to a field_start or to a field_end, no option shall apply to either. Implementations shall support at least nine occurrences of the -k option, which shall be significant in command line order. If no -k option is specified, a default sort key of the entire line shall be used.

When there are multiple key fields, later keys shall be compared only after all earlier keys compare equal. Except when the -u option is specified, lines that otherwise compare equal shall be ordered as if none of the options -d, -f, -i, -n, or -k were present (but with -r still in effect, if it was specified) and with all bytes in the lines significant to the comparison. The order in which lines that still compare equal are written is unspecified.

Isso produziria:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash
    
por 31.03.2014 / 13:43