У меня есть таблица, которая выглядит так
'a;b;f|d;e;c|g;h'
которые я хочу отсортировать по третьему столбцу. Вывод должен быть
'g;h|d;e;c|a;b;f'
Если бы я использовал стандартные разделители whitespace
, newline
то это можно было бы сделать с помощью стандартных sort
:
printf '%b' 'a b f\nd e c\ng h' | sort -k 3
выведет
g h
d e c
a b f
Команда sort
также может использовать нестандартный разделитель полей с -t
опцией:
printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'
выведет
g;h
d;e;c
a;b;f
Однако мне не удалось найти способ сортировки таблицы с разделителем, отличным от newline
разделителя записей.
Можно ли этого добиться? Если да, то как?
Редактировать
Ключевым условием является не изменение ни данных, ни разделителей в процессе, а только порядок их появления.
Другие инструменты, кроме sort
команды, тоже подходят. Предпочтительно совместимые с POSIX, но не обязательно.
решение1
Команда sort может сортировать только входные записи, разделенные символом новой строки или NUL, как указано в руководстве.
Утилита сортировки сортирует текстовые и двоичные файлы по строкам. Строка — это запись, отделенная от последующей записи символом новой строки (по умолчанию) или символом NUL '\0'
Так что в какой-то момент вашей трансформации потребуется знание разделителя записей (в вашем случае |
), чтобы достичь желаемого результата. Любые другие команды (Awk/Perl или datamash) должны будут сделать это предположение
Не с одним автономным инструментом, а с tr
, sort
и paste
вы могли бы сделать. Вы могли бы увидеть, как трансформация приобретает форму, добавляя по одной команде за раз в конвейер
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -