Comment trier un fichier en fonction d'une section d'un champ

11

Je souhaite trier un fichier:

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

et obtenez ceci

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

Autrement dit, trier numériquement le deuxième caractère et les caractères suivants de la première séquence de non-blancs sur la ligne.

edith
la source
apparemment, l'éditeur n'a pas conservé le format que j'ai utilisé pour le fichier ....
edith
Avez-vous essayé la sortcommande?
Eric Renouf
oui, mais apparemment je ne sais pas comment l'utiliser correctement .... J'ai essayé: trier -b + 0.1n -1 mais aussi trier -n -k1,1 -k1,4 (et bien d'autres) mais aucun de ceux qui ont travaillé
edith
1
Vous souhaitez trier selon le numéro à partir du deuxième caractère?
pfnuesel
exactement. le problème est que dans le fichier, il y a différents nombres de blancs avant le premier champ
edith

Réponses:

19
sort -k 1.2bn < file

Trie de manière numérique sur un œil kcommençant par le 2nième caractère du champ 1st en ignorant les blanks de tête (et se terminant à la fin de la ligne, mais cela n'a pas d'importance pour un tri numérique qui ne prend en compte que la séquence initiale de chiffres décimaux).

Notez que s'il y a une égalité, comme entre ces deux lignes:

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

Ensuite, l'ordre sera basé sur le tri de dernier recours qui compare complètement les deux lignes sous forme de chaînes.

Avec certains paramètres régionaux, les blancs seraient ignorés en premier lieu pour comparer les chaînes, auquel cas le F91 viendrait avant K92 (comme Ftrié auparavant K). Avec d'autres comme dans les paramètres régionaux C, les blancs ne seraient pas ignorés et le K92 viendrait alors avant le F91 (tri de l'espace avant F).

Pour un tri de dernier recours qui ignorerait les espaces vides quels que soient les paramètres régionaux, vous pouvez faire:

sort -k 1.2bn -k 1b < file

Celui- 1bci serait trié (sur les liens sur la première clé) lexicalement sur la section de la ligne qui commence par le premier champ en ignorant les blancs en tête.

Stéphane Chazelas
la source