我想知道我是否可以使用十六进制值作为Unix sort
实用程序的分隔符。
基本上我想做类似的事情:
sort -t '\x00' <input
但是,如果我按照上面的方式进行,它就不起作用。
答案 0 :(得分:5)
如果你阅读了GNU sort
手册,你会发现:
-t separator
,--field-separator=separator
在每个中查找排序键时,使用字符分隔符作为字段分隔符 线。默认情况下,字段由非空白之间的空字符串分隔 字符和空白字符。默认情况下,空白是空格或制表符,但是 LC_CTYPE语言环境可以改变这一点。 也就是说,给定输入行
foo bar
,sort将其分解为字段foo
和bar
。字段分隔符不被视为前面字段的一部分 或者跟随字段,因此sort -t " "
相同的输入行有三个 fields:空字段,'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 @ 执行此操作; shell(bash
)不喜欢这样。
我有一个程序genchar
,它将字节写入输出,所以我尝试了:
sort -t "$(genchar 0)" ...
这也不起作用;我收到sort
的错误。
$ genchar 0 | od -c
0000000 \0 \n
0000002
$
如果您能够使用control-A,那么就没有问题了。
请注意sort
不会在'-t
'选项参数中展开十六进制转义序列;你必须提供你想要使用的实际字节。您可能也不能使用换行符作为字段分隔符;如果你这样做了,记录分隔符是什么?
GNU'sort'(无论如何,来自CoreUtils 5.97;当前版本是8.12 - 截至2011-04-26)确实支持-z
选项:
-z
,--zero-terminated
结束行0字节,而不是换行符遗憾的是,这不是你想要的。