Sortowanie danych na podstawie drugiej kolumny pliku


212

Mam plik dwóch kolumn i nliczby wierszy.

kolumna 1 zawiera namesi kolumna 2 age.

Chcę posortować zawartość tego pliku w porządku rosnącym na podstawie age(w drugiej kolumnie).

Wynik powinien wyświetlać namenajmłodszą osobę, namea następnie drugą najmłodszą osobę i tak dalej ...

Wszelkie sugestie dotyczące powłoki jednowarstwowej lub skryptu bash.


Odpowiedzi:


329

Możesz użyć sortpolecenia :

sort -k2 -n yourfile

-n, --numeric-sortporównaj według wartości liczbowej ciągu

Na przykład:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
zauważ również, że użycie -hzamiast -nposortuje wartości czytelne dla ludzi, takie jak 2Glub, 3Ka także liczby oddzielone przecinkami, np.1,234.5
chillitom

Wystąpił problem z „złym” zamówieniem. Zwróć uwagę na człowieka „*** OSTRZEŻENIE *** Ustawienia regionalne określone przez środowisko wpływają na porządek sortowania. Ustaw, LC_ALL=Caby uzyskać tradycyjny porządek sortowania, który używa rodzimych wartości bajtów.” (w przypadku braku dopasowania ciągu -n)
x'ES

Nie uwzględnia to spacji w pierwszej kolumnie ani nie działa, jeśli po drugiej jest więcej kolumn, ponieważ -k czyta do końca linii. Załóżmy, że jest to plik TSV, lepszym rozwiązaniem jestsort -t$'\t' -k2 -n FILE
tuxErrante,

może być konieczne określenie ogranicznika za pomocą opcji -t
spectrum

85

Rozwiązanie:

sort -k 2 -n filename

bardziej szczegółowo napisane jako:

sort --key 2 --numeric-sort filename


Przykład:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Wyjaśnienie:

  • -k # - ten argument określa pierwszą kolumnę, która zostanie użyta do sortowania. (zwróć uwagę, że kolumna tutaj jest zdefiniowana jako białe pole rozdzielone; argument -k5będzie sortowany począwszy od piątego pola w każdym wierszu, a nie piątego znaku w każdym wierszu)

  • -n - ta opcja określa „sortowanie numeryczne”, co oznacza, że ​​kolumna powinna być interpretowana jako wiersz liczb zamiast tekstu.


Więcej:

Inne typowe opcje obejmują:

  • -r - ta opcja odwraca porządek sortowania. Można go również zapisać jako --reverse .
  • -i - Ta opcja ignoruje znaki niedrukowalne. Można go również zapisać jako --ignore-nonprinting .
  • -b - Ta opcja ignoruje wiodące puste miejsca, co jest przydatne, ponieważ do określenia liczby wierszy używane są białe spacje. Można go również zapisać jako --ignore-wiodący-puste .
  • -f - Ta opcja ignoruje wielkość liter. „A” == „a”. Można go również zapisać jako --ignore-case .
  • -t [nowy separator] - Ta opcja powoduje, że przetwarzanie wstępne korzysta z operatora innego niż spacja. Można go również zapisać jako --field-separator .

Istnieją inne opcje, ale są to najczęściej używane i pomocne, z których często korzystam.


@Angelo Ta odpowiedź została prawdopodobnie opublikowana wiele lat po zaakceptowaniu odpowiedzi na to pytanie, ale czy uważasz ją za nową zaakceptowaną odpowiedź?
Jonathan Y.

Opcja -tbyła prawdziwa oszczędność życia !! gdy twoje kolumny mają spacje, a kolumny różnią się danym znakiem, takim jak ,tabulator
AKS

12

W przypadku wartości rozdzielanych tabulatorami można zastosować poniższy kod

sort -t$'\t' -k2 -n

-r można użyć do pobierania danych w kolejności malejącej.
-n do sortowania numerycznego
-k, --key = POS1 [, POS2] gdzie k to kolumna w pliku
W porządku malejącym poniżej znajduje się kod

sort -t$'\t' -k2 -rn

4

Zastosowanie sort.

sort ... -k 2,2 ...

8
Musisz także użyć -n, aby sortować według wieku (sortowanie numeryczne). W przeciwnym razie „11” pojawi się przed „2”.
Matt Ryall
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.