Утилита сортировки Unix: используйте шестнадцатеричное значение байта в качестве разделителя - PullRequest
3 голосов
/ 27 апреля 2011

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

sort -t '\x00' <input

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

1 Ответ

5 голосов
/ 27 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...