usa a classificação GNU para ordenar por uma única chave / impede a ordenação indesejada de outras chaves

9

Eu tenho um arquivo que contém dados já ordenados e gostaria de reordenar o arquivo de acordo com os valores em uma chave, sem destruir a ordem dos dados nas outras chaves.

Como eu evito que o GNU sort execute a ordenação de linhas com base nos valores das chaves que eu não especifiquei, ou como eu especifico ao GNU sort para ignorar um intervalo de chaves ao ordenar?

Arquivo data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Resultado esperado:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Comando:

sort -k 1,1 <data.txt

Resultado: classificação indesejada que não pedi:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
    
por Wil 29.06.2017 / 04:02

2 respostas

20

Você precisa de um tipo estável . De man sort :

-s, --stable
       stabilize sort by disabling last-resort comparison

viz:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Note que você provavelmente também deseja um -n ou --numeric-sort se sua chave for numérica (por exemplo, você pode obter resultados inesperados ao comparar 10 a 2 com a ordem de classificação léxico-padrão). Nesse caso, é só uma questão de fazer:

sort -sn <data.txt

Não há necessidade de extrair o primeiro campo, pois a interpretação numérica da linha inteira será a mesma do primeiro campo.

    
por 29.06.2017 / 04:09
4

Para implementações (não-GNU) sort sem uma opção -s , você sempre pode fazer:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Ou seja, prefixar o número da linha para torná-la a segunda chave de classificação e removê-la depois.

    
por 29.06.2017 / 11:10

Tags