Como o UNIX classifica por apenas uma coluna?


47

Eu sei que a opção -k para a classificação do Unix nos permite classificar por uma coluna específica e todos os seguintes . 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 classificada pela 1ª coluna e depois pela 2ª:

1 1
1 2
2 1
2 2
2 3

No entanto, quero manter a segunda coluna em ordem, assim:

1 2
1 1
2 3
2 2
2 1

Isso é possível com o sortcomando?

Respostas:


65

Faça uma tentativa:

sort -s -n -k 1,1

Os -sdesativa 'último recurso' classificação, que classifica em tudo o que não era parte de uma chave especificada.

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


Você está certo. Isso é exatamente o que eu precisava. Obrigado!

é possível usar join na saída desse tipo?
MiNdFrEaK

@MiNdFrEaK: O requisito de joiné que a entrada seja classificada nos campos nos quais você está ingressando. Então, com certeza, essa saída está classificada no primeiro campo e você pode participar.
Cascabel

Eu tenho 2 arquivos, um com 2 colunas, outro com 1 coluna. O segundo arquivo é classificado usando sort -u. Agora, a tarefa é que eu preciso ingressar nesta coluna na primeira coluna do primeiro arquivo, que não está classificada, então qual será a sintaxe? Isso vai funcionar? juntar -j 1 arquivo2.txt classificar -s -n -k 1 arquivo1.txt?
MiNdFrEaK

1
A -k 1,1(a parte " , 1 ") não funciona melhor para mim. O que funciona é -s -k 1, -nse você precisar.
Totor 8/08/13

10

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

sort -n -s -k1,1

No manual de administração de sistemas Unix e Linux

sort aceita a especificação de chave -k3 (em vez de -k3,3), mas provavelmente não faz o que você espera. Sem o número do campo final, a chave de classificação continua até o final da linha


Não funcionando para mim, preciso adicionar a -sopção, como apontou Cascabel.
Jean Paul

@JeanPaul, você está certo, a documentação -sdiz "Esta opção mantém a ordem original dos registros com uma chave igual".
tidbeck

2

Nenhuma das respostas fornecidas funciona geralmente para mim.

Ambos sort -s -k 2 file1e sort -n -k1,1faça 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. Essa solução pode não funcionar bem em um arquivo muito grande porque o arquivo inteiro precisa ser lido para cada valor exclusivo 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

sort -s -k2,2 file1
24517 plhn

A resposta proposta por Cascabel está funcionando, mas acho que você a interpretou mal.
Jean Paul
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.