Sortowanie pliku według pierwszej, a następnie drugiej kolumny


13

Jak mogę manipulować plikiem tekstowym oddzielonym tabulatorami od dwóch kolumn, sortując według pierwszego elementu drugiej kolumny (tylko jeśli pierwszy element kolumny jest taki sam)?

Przykład:

Plik wejściowy 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Oczekiwany wynik: Plik 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

Odpowiedzi:


22

Użyj opcji sort„s -kopcja do sortowania przez (wielokrotny) kolumn na raz:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1sortuje najpierw pierwszą kolumnę, a następnie -k2ndrugą¹ liczbowo, gdy pierwsza kolumna została powiązana, więc otrzymujesz wynik w odpowiedniej kolejności: sortowanie według pierwszego elementu drugiej kolumny, tylko jeśli pierwszy element kolumny jest taki sam.

Podczas sortowania numerycznego będzie sprawdzane tylko pole, dopóki nie przestanie być liczbą, dzięki czemu uzyskasz porównanie tylko pierwszego jego elementu.

Kiedy oba klucze porównują to samo, sortporównuje pełne linie leksykalnie jako porównanie w ostateczności. Na przykład w A 1-10vs A 1-2, pierwsze klucze są identyczne ( Aciąg znaków), a także drugi klucz (oba są traktowane jako liczba 1), więc sortporównuje A 1-10vs A 1-2leksykalnie, a ten drugi jest większy jak 2sortuje po 1. Implementacja GNU sortma -Vopcję lub Vflagę kluczową do wykonania sortowania według wersji , co jest jak porównanie leksykalne, z tym wyjątkiem, że sekwencje cyfr dziesiętnych w łańcuchach są porównywane numerycznie, więc sort -k1,1 -k2Vposortowałoby A 1-10po, A 1-2ponieważ 10ponieważ liczba jest większa niż 2.


¹ technicznie -k2oznacza część linii rozpoczynającą się od drugiego pola (po pierwszym przejściu z niepustej do pustej) i kończącą się na końcu linii, ale z nflagą, która jest równoważna -k2,2njako tylko część wiodąca to stanowi liczbę jest brany pod uwagę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.