Come ordinare un file in base a una sezione di un campo


11

Vorrei ordinare un file:

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

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

Cioè, ordina numericamente il secondo e i seguenti caratteri della prima sequenza di non-spazi sulla linea.


a quanto pare l'editor non ha mantenuto il formato che ho usato per il file ....
Edith,

Hai provato il sortcomando?
Eric Renouf,

sì, ma a quanto pare non so come lo usi correttamente .... Ho provato: ordina -b + 0.1n -1 ma anche ordina -n -k1,1 -k1,4 (e altri ancora) ma nessuno di quelli hanno funzionato
edith

1
Vuoi ordinare in base al numero a partire dal secondo carattere?
pfnuesel,

Esattamente. il problema è che nel file ci sono diversi numeri di spazi prima del primo campo
edith

Risposte:


19
sort -k 1.2bn < file

Ordina in modo nomerico su un occhio che kinizia con il carattere 2nd del campo 1st ignorando i blank iniziali (e termina alla fine della riga, ma non importa per un ordinamento numerico che considera solo la sequenza iniziale di cifre decimali).

Nota che se c'è un pareggio, come tra queste due righe:

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

Quindi, l'ordine sarà basato sull'ordinamento dell'ultima risorsa che confronta le due righe come stringhe.

Con alcune versioni locali, gli spazi verrebbero ignorati in prima istanza per confrontare le stringhe, nel qual caso quella F91 verrebbe prima di K92 (come Fprima K). Con altri come nel locale C, gli spazi bianchi non sarebbero stati ignorati e il K92 sarebbe poi arrivato prima di quello F91 (spazio prima F).

Per un ordinamento di ultima istanza che ignori gli spazi vuoti iniziali a prescindere dalla locale, è possibile eseguire:

sort -k 1.2bn -k 1b < file

Quello 1bsi ordina (legando la prima chiave) in modo lessicale sulla sezione della linea che inizia con il primo campo ignorando gli spazi vuoti iniziali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.