Unix排序实用程序:使用十六进制字节值作为分隔符

时间:2011-04-26 22:47:03

标签: unix sorting

我想知道我是否可以使用十六进制值作为Unix sort实用程序的分隔符。 基本上我想做类似的事情:

sort -t '\x00' <input

但是,如果我按照上面的方式进行,它就不起作用。

1 个答案:

答案 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字节,而不是换行符

遗憾的是,这不是你想要的。