Jak posortować plik na podstawie sekcji pola

11

Chciałbym posortować plik:

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

i weź to

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

Oznacza to, że posortuj numerycznie według drugiego i kolejnych znaków pierwszej sekwencji niepustych znaków w wierszu.

Edith
źródło
Najwyraźniej redaktor nie zachował formatu, którego użyłem dla pliku ...
Edyta
Czy wypróbowałeś sortpolecenie?
Eric Renouf,
tak, ale najwyraźniej nie wiem, jak poprawnie go używać .... próbowałem: sort -b + 0.1n -1, ale także sort -n -k1,1 -k1,4 (i więcej innych), ale żaden z ci pracowali
Edyta
1
Chcesz sortować według numeru zaczynającego się od drugiego znaku?
pfnuesel
dokładnie. Problemem jest to, że w pliku znajdują się różne liczby pustych pól przed pierwszym polem
Edyta

Odpowiedzi:

19
sort -k 1.2bn < file

Sortuje nlosowo na oczach, kzaczynając od 2drugiego znaku pola 1st ignorując wiodące bznaki (i kończąc na końcu linii, ale to nie ma znaczenia dla sortowania numerycznego, który uwzględnia tylko początkową sekwencję cyfr dziesiętnych).

Zauważ, że jeśli jest remis, na przykład pomiędzy tymi dwiema liniami:

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

Następnie kolejność będzie oparta na ostatecznym sortowaniu, w którym dwie linie są w pełni porównywane jako łańcuchy.

W niektórych lokalizacjach puste miejsca byłyby w pierwszej kolejności ignorowane w celu porównania ciągów, w którym to przypadku F91 pojawiłby się przed K92 (jak Fpoprzednio K). W przypadku innych, takich jak ustawienia regionalne C, puste miejsca nie byłyby ignorowane, a K92 pojawiałby się przed F91 (spacja sortuje się wcześniej F).

W przypadku ostatecznego sortowania, które ignoruje wiodące spacje, niezależnie od ustawień regionalnych, możesz:

sort -k 1.2bn -k 1b < file

Ten 1bposortowałby (po remisie na pierwszym kluczu) leksykalnie na odcinku linii, który zaczyna się od pierwszego pola, ignorując wiodące spacje.

Stéphane Chazelas
źródło