Утилита сортировки 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 байтов, а не перевод строки
К сожалению, это не то, что вы ищете.