Como ordenar um arquivo baseado em uma seção de um campo

11

Eu gostaria de classificar um arquivo:

   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
     F91HE*-K92HA      7.242      3.910   4.88e+04 -- 

e obtenha isso

   A90HB#-A90HA      1.655      4.207   7.12e+05 -- 
   A90HB#-F91HA      1.653      4.411   8.59e+04 -- 
   F91HE*-F91HZ      7.237      7.122   7.85e+05 -- 
   F91HE*-K92HA      7.242      3.910   4.88e+04 -- 
   D104HN-D104HA      8.320      4.521   1.69e+05 -- 
   D104HN-D104HB*      8.320      2.823   2.93e+05 -- 
   A114HB#-A114HA      1.253      4.098   7.67e+05 -- 
   A114HB#-R111HA      1.251      3.929   1.76e+05 -- 
   A114HB#-W110HA      1.253      4.451   3.68e+04 -- 

Ou seja, classifique numericamente no segundo e nos seguintes caracteres da primeira seqüência de não-brancos na linha.

    
por edith 22.01.2016 / 14:11

1 resposta

19
sort -k 1.2bn < file

Classifica n umericamente em um k ey começando com o caractere 2 nd do campo 1 st ignorando os b lanks ( e terminando no final da linha, mas isso não importa para um tipo numérico que considere apenas a sequência inicial de dígitos decimais).

Observe que, se houver um empate, entre essas duas linhas:

    F91HE*-K92HA      7.242      3.910   4.88e+04 --
  F91HE*-F91HZ      7.237      7.122   7.85e+05 --

Em seguida, o pedido será baseado na classificação do último recurso que compara as duas linhas totalmente como strings.

Com algumas localidades, espaços em branco seriam ignorados em primeira instância para comparar strings, caso em que o F91 viria antes de K92 (como F classifica antes de K ). Com outros como no local C, os espaços em branco não seriam ignorados e o K92 viria antes do F91 (o espaço é classificado antes de F ).

Para uma classificação de último recurso que ignora os espaços em branco iniciais, independentemente da localidade, você poderia fazer:

sort -k 1.2bn -k 1b < file

Esse 1b um classificaria (após empates na primeira chave) lexicalmente na seção da linha que começa com o primeiro campo, ignorando espaços em branco à esquerda.

    
por 22.01.2016 / 14:31