Używając coreutils sort
, jak mogę sortować numerycznie według wartości szesnastkowej (pola)? Spodziewałem się czegoś podobnego
sort -k3,3x file_to_sort
jednak taki x
nie istnieje.
Edycja: Najlepsze rozwiązanie, jakie do tej pory wymyśliłem, to:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
gdzie cut -d' ' -f3
izoluje pole wyszukiwania (to jest -k3,3
- to może się oczywiście różnić) i bc
wykonuje konwersję na dziesiętną (wymaga dużej liczby szesnastkowej, bez 0x
prefiksu, pasującej do mojego przypadku). Następnie łączę, sortuję i dzielę kolumny.
-k3,3
? Czy masz nubery sześciokątne wpatrujące się w 0x i wszystkie tej samej długości? Brak połączenia wielkich / małych liter? Jeśli tak, powinny być odpowiednio posortowane, gdy są interpretowane jako łańcuchy. Może możesz nam pokazać przykładowe dane?Odpowiedzi:
Rozwiązanie w
perl
:Wyjaśnienie
Podczas przetwarzania pliku tworzymy tablicę tablicy
@h
, każdy jego element jest odwołaniem do tablicy[$F[-1],$_]
, przy czym pierwszym elementem jest wartość szesnastkowa do porównania, a drugim elementem jest cała linia.W
END
bloku używamy transformacji Schwartziana :Z każdym elementem
@h
utwórz anonimową tablicę, zawiera całą linię ($_->[1]
drugi element każdej tablicy@h
) i wartość szesnastkową do porównaniahex($_->[0])]
Sortuj powyżej podstawy tablicy na podstawie wartości szesnastkowej
$a->[1] <=> $b->[1]
Pobierz pierwszy element każdego odwołania do tablicy posortowanej,
map { $_->[0] }
a następnie wydrukuj wynik.Aktualizacja
Z sugestią @Josepha R, bez użycia Transformacji Schwartzian:
Aktualizacja 2
Po przeczytaniu komentarza Stefana myślę, że może to wywołać
direct
:źródło
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
:?hex
Operator jest mało kosztowne wystarczająco, by uzasadnić Schwartzian, prawda?Korzystam z tych przykładowych danych:
Chodzi o to, aby utworzyć nową wersję tych danych z polem sortowania w postaci dziesiętnej. Tj.
awk
Konwertuje go, dołącza do każdej linii, wynik jest sortowany, aw ostatnim kroku usuwane jest dodane pole:Co daje w wyniku:
źródło
sort
?zaadaptowano z: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: plik do sortowania:
Komenda:
Wynik:
- gdzie tupper (0 $) „aktualizuje” małe litery, aby najpierw posortowały (nie jesteś pewien, czy to konieczne?)
źródło
Wejście
Sortowanie jednej wkładki
Sortowanie krok po kroku
Krok 1: Dodaj nową pierwszą kolumnę z dziesiętną reprezentacją liczby szesnastkowej.
Krok 2: Sortuj linie numerycznie na pierwszym polu.
Krok 3: Usuń pierwszą kolumnę.
źródło