So sortieren Sie eine Datei anhand eines Feldabschnitts

11

Ich möchte eine Datei sortieren:

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

und hol dir das

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

Das heißt, sortieren Sie numerisch nach dem zweiten und den folgenden Zeichen der ersten Folge von Nicht-Leerzeichen in der Zeile.

Edith
quelle
anscheinend hat der Editor das Format, das ich für die Datei verwendet habe, nicht
beibehalten
Haben Sie den sortBefehl ausprobiert ?
Eric Renouf
Ja, aber anscheinend weiß ich nicht, wie ich es richtig verwenden soll ... Ich habe versucht: sort -b + 0.1n -1, aber auch sort -n -k1,1 -k1,4 (und mehr andere), aber keine von die arbeiteten
edith
1
Sie möchten nach der Nummer ab dem zweiten Zeichen sortieren?
pfnuesel
genau. Das Problem ist, dass in der Datei vor dem ersten Feld eine unterschiedliche Anzahl von Leerzeichen vorhanden ist
Edith

Antworten:

19
sort -k 1.2bn < file

Sortierungen numerically auf einem key mit dem Start 2nd Charakter des 1st Feldes führt zu ignorieren bLanks (und am Ende der Zeile endet, aber das spielt keine Rolle für eine numerische Art , die nur die erste Folge von Dezimalziffern betrachtet).

Beachten Sie Folgendes: Wenn es ein Unentschieden gibt, wie zwischen diesen beiden Zeilen:

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

Dann basiert die Reihenfolge auf der Sortierung des letzten Auswegs, bei der die beiden Zeilen vollständig als Zeichenfolgen verglichen werden.

Bei einigen Gebietsschemas würden Leerzeichen beim Vergleichen von Zeichenfolgen zunächst ignoriert. In diesem Fall würde das F91 vor K92 stehen (wie Fzuvor sortiert K). Bei anderen wie im Gebietsschema C würden Leerzeichen nicht ignoriert, und der K92 würde dann vor dem F91 stehen (Leerzeichen werden zuvor sortiert F).

Für eine Sortierung der letzten Instanz, bei der führende Leerzeichen unabhängig vom Gebietsschema ignoriert werden, können Sie Folgendes tun:

sort -k 1.2bn -k 1b < file

Dieser 1bwürde (nach Bindungen auf dem ersten Schlüssel) lexikalisch nach dem Abschnitt der Zeile sortieren, der mit dem ersten Feld beginnt, wobei führende Leerzeichen ignoriert werden.

Stéphane Chazelas
quelle