Como ordenar o UNIX apenas por uma coluna?

42

Eu sei que a opção -k para o Unix tipo nos permite classificar por uma coluna específica e todos os itens a seguir . Por exemplo, dado o arquivo de entrada:

2 3
2 2
1 2
2 1
1 1

Usando sort -n -k 1 , recebo uma saída ordenada pela primeira coluna e depois pela segunda:

1 1
1 2
2 1
2 2
2 3

No entanto, quero manter a classificação da segunda coluna, assim:

1 2
1 1
2 3
2 2
2 1

Isso é possível com o comando sort ?

    
por ssn 31.08.2009 / 18:20

3 respostas

58

Experimente:

sort -s -n -k 1,1

O -s desativa a classificação de 'último recurso', que classifica tudo o que não fazia parte de uma chave especificada.

O -k 1 na verdade não significa "este campo e todos os itens a seguir" no contexto de classificação numérica, como você pode ver se tentar classificar na segunda coluna. Você está apenas vendo os laços quebrados indo para o resto da linha. Em geral, no entanto, você precisa especificar -k 1,1 para classificar somente no campo um.

    
por 31.08.2009 / 18:28
10

Para classificar apenas na primeira coluna, você deve fazer:

sort -n -k1,1

De Manual de administração do sistema Unix e Linux

sort accepts the key specification -k3 (rather than -k3,3), but it probably doesn’t do what you expect. Without the terminating field number, the sort key continues to the end of the line

    
por 16.10.2012 / 15:59
2

Nenhuma das respostas fornecidas funciona geralmente para mim.

Tanto sort -s -k 2 file1 como sort -n -k1,1 fazem uma classificação adicional com este arquivo:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Eu só tinha que fazer exatamente isso e acabei usando um loop de shell. Esta solução pode não funcionar bem em um arquivo muito grande porque arquivo precisa ser lido para cada valor único na coluna classificada.

Aqui, o arquivo é classificado apenas na coluna 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7
    
por 30.12.2016 / 18:47

Tags