Jak UNIX sortować według jednej kolumny?

47

Wiem, że opcja -k dla sortowania uniksowego pozwala nam sortować 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

Za pomocą sort -n -k 1otrzymuję dane wyjściowe posortowane według pierwszej kolumny, a następnie według drugiej:

1 1
1 2
2 1
2 2
2 3

Chcę jednak zachować kolejność drugiej kolumny, tak jak poniżej:

1 2
1 1
2 3
2 2
2 1

Czy jest to możliwe dzięki sortpoleceniu?

ssn
źródło

Odpowiedzi:

64

Wypróbuj to:

sort -s -n -k 1,1

The -sWyłącza „last resort” sortowania, który sortuje się na wszystko, co nie było częścią określonego klucza.

Nie -k 1oznacza to w rzeczywistości „tego pola i wszystkich poniższych” w kontekście sortowania numerycznego, co widać, jeśli spróbujesz sortować według drugiej kolumny. Po prostu widzisz zerwane więzy, przechodząc do reszty linii. Zasadniczo jednak musisz określić -k 1,1sortowanie tylko według pola pierwszego.

Cascabel
źródło
Masz rację. Właśnie tego potrzebowałem. Dzięki!
czy można użyć łączyć na wyjściu tego rodzaju?
MiNdFrEaK
@MiNdFrEaK: Wymagane joinjest, aby dane wejściowe były sortowane według pól, do których dołączasz . Więc upewnij się, że dane wyjściowe są posortowane według pierwszego pola i możesz do niego dołączyć.
Cascabel
Mam 2 pliki, jeden z 2 kolumnami, drugi z 1 kolumną. Drugi plik jest sortowany za pomocą sort -u. Teraz muszę połączyć tę kolumnę z pierwszą kolumną pierwszego pliku, który nie jest posortowany, więc jaka będzie składnia? Czy to zadziała? dołącz -j 1 plik2.txt sortuj -s -n -k 1 plik1.txt?
MiNdFrEaK
1
-k 1,1( Część „ 1 ”) nie działa dla mnie lepiej. Działa -s -k 1, -njeśli potrzebujesz.
Totor
10

Aby posortować tylko według pierwszej kolumny, należy:

sort -n -s -k1,1

Z podręcznika administracji systemu Unix i Linux

sort akceptuje kluczową specyfikację -k3 (zamiast -k3,3), ale prawdopodobnie nie spełnia oczekiwań. Bez numeru pola kończącego klucz sortowania przechodzi do końca wiersza

Tidbeck
źródło
Nie działa dla mnie, muszę dodać -sopcję, jak wskazał Cascabel.
Jean Paul
@JeanPaul masz rację, dokumentacja -smówi: „Ta opcja zachowuje oryginalną kolejność rekordów, które mają taki sam klucz”.
Tidbeck
2

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

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

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

Po prostu musiałem zrobić dokładnie to i skończyłem na pętli powłoki. To rozwiązanie może nie działać dobrze w przypadku bardzo dużego pliku, ponieważ należy odczytać cały plik dla każdej unikalnej wartości w posortowanej kolumnie.

Tutaj plik jest sortowany tylko w 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
użytkownik680341
źródło
sort -s -k2,2 file1
plhn
Odpowiedź zaproponowana przez Cascabel działa, ale myślę, że ją przegapiłeś.
Jean Paul