Ordenar pelo último caractere de entrada e, em seguida, pelo número anterior?

3

Eu tenho um arquivo assim:

foo03a
foo02b
quux01a
foo01a
foo02a
foo01b
foo03b
quux01b

Eu gostaria que fosse ordenado pelo último caractere (então a e b aparecem juntos) e depois pelo número anterior, e depois pelo prefixo (embora isso não seja essencial). Então isso resulta em:

foo01a
quux01a
foo02a
foo03a
foo01b
quux01b
foo02b
foo03b

Na verdade, não importa onde aparecem quux01a e quux01b , contanto que estejam no grupo relevante - eles podem aparecer como mostrado, antes de foo01b ou depois de foo03b .

Por quê? Estes são nomes de servidores usados em uma implantação azul / verde, então eu quero os servidores 'A' juntos, depois os servidores 'B'.

Eu encontrei a opção -k para a classificação GNU, mas não entendo como usá-la para especificar um caractere em particular, contando a partir do final da string.

Eu tentei cat foos | rev | sort | rev , mas classifica foo10a e foo10b (quando a contar até agora) no lugar errado.

    
por Roger Lipscombe 29.03.2016 / 16:10

2 respostas

2

Eu encontrei uma solução usando a função awk do GNU match :

cat foos | \
  gawk 'match($0, /([^0-9]+)([0-9]+)([^0-9]+)/, a) {print a[3], a[2], $0}' | \
  sort | cut -d' ' -f3

O comando gawk usa capturas de expressão regular para gerar a chave de classificação, para que eu termine com o seguinte:

a 03 foo03a
b 02 foo02b

... etc.

Execute isso por meio de sort , cut para os campos desejados. Feito.

    
por 29.03.2016 / 16:23
1

Você pode sort pela posição do caractere (indicada pelo número após . ) do campo (aqui campo 1):

sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt 

Exemplo:

$ cat file.txt 
foo03a
foo02b
foo01a
foo02a
foo01b
foo03b

$ sort -k1.6 -k1.4,1.5n -k1.1,1.3 file.txt 
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b

Inversa, usando rev :

$ rev file.txt | sort -k1.1,1.1 -k1.2,1.3n -k1.4 | rev
foo01a
foo02a
foo03a
foo01b
foo02b
foo03b
    
por 29.03.2016 / 16:31

Tags