Используя coreutils sort
, как я могу отсортировать численно по шестнадцатеричному значению (поле)? Я ожидал что-то вроде
sort -k3,3x file_to_sort
однако такого x
не существует.
Изменить: лучшее решение, которое я придумал, это:
{ echo ibase=16; cut -d' ' -f3 file_to_sort; } |
bc | paste -d: - file_to_sort | sort -t: -k1,1n | cut -d: -f2-
где cut -d' ' -f3
изолирует поле поиска (это -k3,3
- это, конечно, может отличаться) и bc
выполняет преобразование в десятичное число (требуется шестнадцатеричный регистр в верхнем регистре без 0x
префикса, соответствующий моему регистру). Затем я объединяю, сортирую и разделяю столбцы.
-k3,3
? У вас есть шестигранные нуберы, начиная с 0x и все одинаковой длины? Нет сочетания прописных и строчных букв? Если да, они должны сортироваться правильно, когда интерпретируются как строки. Может быть, вы можете показать нам пример данных?Ответы:
Решение в
perl
:объяснение
При обработке файла мы создаем массив массива
@h
, каждый его элемент является ссылкой на массив[$F[-1],$_]
, первый элемент - это шестнадцатеричное значение для сравнения, а второй элемент - целая строка.В
END
блоке мы используем преобразование Шварца :С каждым элементом
@h
создайте анонимный массив, содержащий всю строку ($_->[1]
второй элемент каждого массива ref in@h
) и шестнадцатеричное значение для сравнения.hex($_->[0])]
Сортировать выше массива на основе шестнадцатеричного значения
$a->[1] <=> $b->[1]
Получить первый элемент каждого массива ref в отсортированном массиве, а
map { $_->[0] }
затем вывести результат.Обновить
С предложением @Joseph R, без использования преобразования Шварца:
Обновление 2
Прочитав комментарий Стефана, я думаю, что это может вызвать
direct
:источник
print for sort { hex $a->[-1] <=> hex $b->[-1] } @h
?hex
Оператор вряд ли достаточно дорого , чтобы оправдать Шварц, не так ли?Я использую этот пример данных:
Идея состоит в том, чтобы создать новую версию этих данных с полем сортировки в десятичной форме. Т.е.
awk
преобразует его, добавляет к каждой строке, результат сортируется, и в качестве последнего шага добавленное поле удаляется:Что приводит к такому выводу:
источник
sort
?вход
Сортировка одного вкладыша
Сортировка шаг за шагом
Шаг 1: Добавьте новый первый столбец с десятичным представлением шестнадцатеричного числа.
Шаг 2: Сортируйте строки численно на первом поле.
Шаг 3: Удалить первый столбец.
источник
адаптировано из: http://www.unix.com/302548935-post6.html?s=b4b6b3ed50b6831717f6429113302ad6
: Файл к сортировке:
Команда:
Выход:
- где toupper ($ 0) «обновляет» строчные буквы, чтобы они сначала сортировались (хотя не уверены, что это необходимо?)
источник