Mam potencjalnie duże pliki, które muszą być sortowane według 1-n kluczy. Niektóre z tych kluczy mogą być numeryczne, a niektóre nie. Jest to plik kolumnowy o stałej szerokości, więc nie ma ograniczników.
Czy jest dobry sposób na zrobienie tego z sortowaniem w systemie Unix? Z jednym klawiszem jest to tak proste, jak użycie „-n”. Przeczytałem stronę podręcznika i krótko przeszukałem Google, ale nie znalazłem dobrego przykładu. Jak bym się do tego zabrał?
Uwaga: wykluczyłem Perla ze względu na potencjalny rozmiar pliku. To byłaby ostateczność.
Odpowiedzi:
Użyj
-k
opcji (lub--key=POS1[,POS2]
). Może pojawić się wiele razy, a każdy klucz może mieć opcje globalne (takie jakn
sortowanie numeryczne)źródło
Uważaj jednak:
Jeśli chcesz posortować plik głównie według pola 3, a po drugie według pola 2, chcesz to:
Nie to:
sort -k 3 -k 2 < inputfile
które sortuje plik według ciągu od początku pola 3 do końca wiersza (który jest potencjalnie unikalny).źródło
sort -k 3,3nr -k 2,2
-k2
powinien być,-k2,2
a końcowy przecinek-k2,
powinien oznaczać „magiczny domyślny koniec wiersza lub cokolwiek innego”.Opcja -k jest tym, czego chcesz.
Użyłby pozycji 4-5 znaków w pierwszym polu (jest to jedno pole o stałej szerokości) i posortowałby numerycznie jako pierwszy klucz.
Drugi klucz również będzie zawierał znaki 14-15 w pierwszym polu.
(edytować)
Przykład (wszystko co mam to DOS / cygwin pod ręką):
dla danych:
Sortuje listę katalogów według numeru miesiąca (poz. 4-5), a następnie odwrotnie według nazwy pliku (poz. 40-60). Ponieważ nie ma żadnych zakładek, sortowanie zajmuje całe pole 1.
źródło
Oto jeden do sortowania różnych kolumn w pliku csv według kolejności numerycznej i słownika, kolumny 5 i później w porządku słownikowym
Zwróć uwagę, że -k1,1n oznacza numeryczne zaczynające się od kolumny 1 i kończące się w kolumnie 1. Gdybym zrobił to poniżej, połączyłoby to kolumny 1 i 2, co 1,10 posortowałoby jako 110
źródło
Wierzę w twoim przypadku w coś takiego
będzie działać lepiej. @ to separator pól, upewnij się, że jest to znak, który nigdzie nie występuje. wtedy twoje wejście jest traktowane jako składające się z jednej kolumny.
Edycja: najwyraźniej clintp udzielił już podobnej odpowiedzi, przepraszam. Jak wskazuje, flagi 'n' i 'r' można dodać do każdej opcji -k ....
źródło
Zauważ, że może być również pożądane ustabilizowanie sortowania za pomocą
-s
przełącznika, tak aby równo uszeregowane linie również zachowały swoją pierwotną względną kolejność na wyjściu.źródło
Chcę tylko dodać kilka wskazówek, kiedy używasz sortowania, uważaj na ustawienia regionalne, które mają wpływ na kolejność porównania kluczy. Zwykle jawnie używam LC_ALL = C, aby ustawić ustawienia regionalne tak, jak chcę.
źródło