Сортировка таблицы с разделителем записей, отличным от символа новой строки, в bash

Сортировка таблицы с разделителем записей, отличным от символа новой строки, в bash

У меня есть таблица, которая выглядит так

'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'|' -

Связанный контент