2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

Jak w UNIX-ie sortować tylko według jednej kolumny?

Wiem, że opcja -k dla uniksowego sort pozwala nam na sortowanie według określonej kolumny i wszystkich poniższych. Na przykład, biorąc pod uwagę plik wejściowy:

2 3
2 2
1 2
2 1
1 1

Używając opcji sort -n -k 1, otrzymuję wyjście posortowane według 1. kolumny, a następnie według 2. kolumny:

1 1
1 2
2 1
2 2
2 3

Jednak chcę zachować porządek 2. kolumny, np. tak:

1 2
1 1
2 3
2 2
2 1

Czy jest to możliwe za pomocą polecenia sort?

Odpowiedzi (3)

68
68
68
2009-08-31 16:28:27 +0000

Spróbuj tego:

sort -s -n -k 1,1

The -s wyłącza sortowanie “last-resort”, które sortuje na wszystkim, co nie było częścią określonego klucza.

The -k 1 nie oznacza w rzeczywistości “to pole i wszystkie poniższe” w kontekście sortowania numerycznego, jak widać, jeśli spróbujesz sortować na drugiej kolumnie. Po prostu widzisz krawaty zerwane przez przejście do reszty linii. Ogólnie jednak, musisz podać -k 1,1, aby sortować tylko na polu pierwszym.

10
10
10
2012-10-16 13:59:28 +0000

Aby sortować tylko na pierwszej kolumnie, powinieneś zrobić:

sort -n -s -k1,1

Z Unix and Linux System Administration Handbook

sort akceptuje specyfikację klucza -k3 (a nie -k3,3), ale prawdopodobnie nie robi tego, czego oczekujesz. Bez numeru pola kończącego, klucz sortowania kontynuuje do końca linii

2
2
2
2016-12-30 17:47:12 +0000

Żadna z podanych odpowiedzi nie działa ogólnie dla mnie.

Zarówno sort -s -k 2 file1, jak i sort -n -k1,1 wykonują dodatkowe sortowanie za pomocą tego pliku:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Właśnie musiałem zrobić tę dokładną rzecz i skończyło się na użyciu pętli powłoki. To rozwiązanie może nie działać dobrze na bardzo dużym pliku, ponieważ cały plik musi zostać odczytany dla każdej unikalnej wartości w posortowanej kolumnie.

Tutaj plik jest posortowany tylko na kolumnie 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7