Утилита сортировки Unix: использование шестнадцатеричного байтового значения в качестве разделителя

Мне интересно, могу ли я использовать шестнадцатеричное значение как разделитель утилиты Unix sort. В основном я хочу сделать что-то вроде:

sort -t '\x00' <input

Но это не сработает, если я сделаю это выше.

Ответ 1

Если вы прочитали руководство GNU sort, вы найдете:

-t separator, --field-separator=separator

Используйте разделитель символов в качестве разделителя полей при поиске ключей сортировки в каждом линия. По умолчанию поля разделяются пустой строкой между непустым символ и пустой символ. По умолчанию пробел - это пробел или вкладка, но локаль LC_CTYPE может изменить это. То есть, учитывая входную строку foo bar, сортировка разбивает ее на поля foo и bar. Сепаратор поля не считается частью поля, предшествующего или следующее поле, поэтому с sort -t " " одна и та же строка ввода имеет три поля: пустое поле, "foo" и "bar". Однако поля, которые доходят до конца строки, как -k 2, или поля, состоящие из диапазона, как -k 2,3, сохраняют поле между конечными точками диапазона. Чтобы указать ASCII nul в качестве разделителя полей, используйте двухсимвольную строку \0, например, sort -t ’\0’.

Это работало со старым (GNU CoreUtils 5.97) sort.


<ы > Кажется, что нет способа сделать это в Linux. Я пробовал несколько трюков, чтобы получить байт NUL (0x00) в разделителе, а команда sort жалуется:

sort: empty tab

Вы не можете сделать это с помощью Control-V @ при вводе командной строки; оболочке (bash) это не нравится.

У меня есть программа genchar, которая записывает байты на вывод, поэтому я попробовал:

sort -t "$(genchar 0)" ...

И это тоже не сработало; Я получил ошибку от sort.

$ genchar 0 | od -c
0000000  \0  \n
0000002
$

Если бы вы могли использовать control-A вместо этого, тогда не было бы проблем.

Обратите внимание, что sort не расширяет шестнадцатеричные escape-последовательности в аргументе опции "-t"; вы должны указать фактический байт, который хотите использовать. Вы, вероятно, не можете использовать новую строку как разделитель полей; если бы вы это сделали, каков будет разделитель записей?

GNU 'sort' (от CoreUtils 5.97, во всяком случае, текущая версия - 8.12 - по состоянию на 2011-04-26) поддерживает опцию -z:

  • -z, --zero-terminated концевые строки с 0 байт, а не символ новой строки

Это, к сожалению, не то, что вы ищете.