Como classificar um arquivo com base 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 pegue 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 o segundo e os seguintes caracteres da primeira sequência de não espaços em branco na linha.

Edith
fonte
aparentemente, o editor não manter o formato que eu usei para o arquivo ....
Edith
Você já tentou o sortcomando?
Eric Renouf
sim, mas aparentemente eu não sei como tu usá-lo corretamente .... Eu tentei: classifique -b + 0.1n -1, mas também classifique -n -k1,1 -k1,4 (e mais outros), mas nenhum dos quem trabalhou
edith
1
Deseja classificar de acordo com o número que começa no segundo caractere?
Pfnuesel
exatamente. o problema é que, no arquivo, existem diferentes números de espaço em branco antes do primeiro campo
edith

Respostas:

19
sort -k 1.2bn < file

Classifica numerically sobre um key começando com o 2ND de caracteres do 1r campo ignorando principais blanks (e terminando no final da linha, mas que não importa para um tipo numérico que considera apenas a sequência inicial de dígitos decimais).

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

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

Em seguida, a ordem será baseada na classificação de último recurso que compara as duas linhas completamente como seqüências de caracteres.

Com alguns códigos de idioma, os espaços em branco seriam ignorados em primeira instância para comparar as strings; nesse caso, o F91 viria antes do K92 (como Fantes K). Com outras pessoas como no local C, os espaços em branco não seriam ignorados e o K92 viria antes do F91 (o espaço classifica antes F).

Para uma classificação de último recurso que ignoraria espaços em branco à parte, independentemente do código do idioma, você pode:

sort -k 1.2bn -k 1b < file

Essa 1bclassificaria (após empates na primeira tecla) lexicamente na seção da linha que começa com o primeiro campo ignorando espaços em branco à esquerda.

Stéphane Chazelas
fonte