Cómo ordenar un archivo en función de una sección de un campo

11

Me gustaría ordenar un archivo:

   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 -- 

y consigue esto

   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 -- 

Es decir, ordenar numéricamente en el segundo y siguientes caracteres de la primera secuencia de no espacios en blanco en la línea.

edith
fuente
aparentemente el editor no mantuvo el formato que usé para el archivo ...
edith
¿Has probado el sortcomando?
Eric Renouf
sí, pero aparentemente no sé cómo usarlo correctamente ... Intenté: sort -b + 0.1n -1 pero también sort -n -k1,1 -k1,4 (y más) pero ninguno de aquellos trabajados
edith
1
¿Desea ordenar según el número a partir del segundo carácter?
pfnuesel
exactamente. el problema es que en el archivo, hay diferentes números de espacios en blanco antes del primer campo
edith

Respuestas:

19
sort -k 1.2bn < file

Se nordena numéricamente en un key que comienza con el carácter 2nd del campo 1st , ignorando los blagos iniciales (y terminando al final de la línea, pero eso no importa para una ordenación numérica que solo considera la secuencia inicial de dígitos decimales).

Tenga en cuenta que si hay un empate, como entre estas dos líneas:

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

Luego, el orden se basará en el último recurso que compara las dos líneas completamente como cadenas.

Con algunos entornos locales, los espacios en blanco se ignorarían en primera instancia para comparar cadenas, en cuyo caso el F91 vendría antes que K92 (como Fantes K). Con otros como en la configuración regional C, los espacios en blanco no se ignorarían y el K92 vendría antes que el F91 (el espacio se clasifica antes F).

Para una ordenación de último recurso que ignoraría los espacios en blanco iniciales independientemente de la configuración regional, puede hacer lo siguiente:

sort -k 1.2bn -k 1b < file

Ese 1bse ordenaría (por los vínculos en la primera tecla) léxicamente en la sección de la línea que comienza con el primer campo ignorando los espacios en blanco iniciales.

Stéphane Chazelas
fuente