Утилита сортировки 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 байтов, а не перевод строки

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

Другие вопросы по тегам