2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

Como classificar UNIX por uma única coluna?

Eu sei que a opção -k para o Unix sort permite-nos ordenar por uma coluna específica e todas as seguintes*. Por exemplo, dado o ficheiro de entrada:

2 3
2 2
1 2
2 1
1 1

Utilizando sort -n -k 1, obtenho uma saída ordenada pela 1ª coluna e depois pela 2ª:

1 1
1 2
2 1
2 2
2 3

Contudo, quero manter a ordenação da 2ª coluna, desta forma:

1 2
1 1
2 3
2 2
2 1

É isto possível com o comando sort?

Respostas (3)

68
68
68
2009-08-31 16:28:27 +0000

Experimente:

sort -s -n -k 1,1

O -s desactiva a classificação de ‘último recurso’, que se baseia em tudo o que não fazia parte de uma chave especificada.

O -k 1 não significa realmente “este campo e todos os seguintes” no contexto da ordenação numérica, como se pode ver se se tenta ordenar na segunda coluna. Está apenas a ver os laços quebrados ao ir para o resto da linha. Em geral, contudo, é necessário especificar -k 1,1 para ordenar somente no campo um.

10
10
10
2012-10-16 13:59:28 +0000

Para classificar apenas na primeira coluna, deve fazê-lo:

sort -n -s -k1,1

De Unix and Linux System Administration Handbook

sort aceita a especificação chave -k3 (em vez de -k3,3), mas provavelmente não faz o que se espera. Sem o número do campo terminal, a chave de ordenação continua até ao fim da linha

2
2
2
2016-12-30 17:47:12 +0000

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 ficheiro:

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

Só tive de fazer exactamente isto e acabei por usar um laço de concha. Esta solução pode não funcionar bem num ficheiro muito grande porque o ficheiro inteiro precisa de ser lido para cada valor único na coluna ordenada.

Aqui o ficheiro é ordenado 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