我想知道是否可以使用十六进制值作为 Unix
sort
实用程序的分隔符。
基本上我想做一些类似的事情:
sort -t '\x00' <input
但是如果我按照上面的方式做是不行的。
如果您阅读 GNU
sort
手册,您会发现:
,-t separator
--field-separator=separator
在每个字段中查找排序键时,使用字符分隔符作为字段分隔符 线。默认情况下,字段由非空白之间的空字符串分隔 字符和空白字符。默认情况下,空白是空格或制表符,但是 LC_CTYPE 语言环境可以改变这一点。 也就是说,给定输入行
,排序将其分为字段foo bar
和foo
。字段分隔符不被视为前面字段的一部分 或后面的字段,因此对于bar
,同一输入行有三个 fields:空字段、“foo”和“bar”。但是,延伸到末尾的字段 行的,如sort -t " "
,或由范围组成的字段,如-k 2
,保留字段 范围端点之间存在分隔符。 要将 ASCII nul 指定为字段分隔符,请使用两个字符的字符串-k 2,3
, 例如,\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
不会扩展“-t
”选项参数中的十六进制转义序列;您必须提供您想要使用的实际字节。 您可能也不能使用换行符作为字段分隔符;如果这样做,记录分隔符是什么?
GNU“排序”(无论如何,从 CoreUtils 5.97 开始;当前版本是 8.12 - 截至 2011 年 4 月 26 日)确实支持
-z
选项:
-z
, --zero-terminated
以 0 字节结束行,而不是换行符遗憾的是,这不是您正在寻找的。
正如 Jonathan Leffler 所指出的,GNU
sort
没有内部字段分隔符,但您可以使用 tr
将其替换为文件中没有的其他字符,然后返回它。
示例:
让我们创建一个两行测试文件:
echo -e 'this\x19\list\nhas\x19hexa chars' > file.tmp
cat file.tmp | od -ch
0000000 t h i s 031 l i s t \n h a s 031 h e
6874 7369 6c19 7369 0a74 6168 1973 6568
0000020 x a c h a r s \n
6178 6320 6168 7372 000a
0000031
(请注意,
od
显示反转的字符对,即:ht=6874,is=7369,l x19=6c19)因此,该文件在@位置有一个十六进制字符0x19:
this@list
has@hexa chars
然后我们将所需的字符 \x19 更改为磅
#
字符,按第二个字段排序,然后撤消:
sort -k 2 -t $'#' <(cat file.tmp | tr $'\x19' '#') | tr '#' $'\x19'
结果:
has@hexa chars
this@list
其中 @ 是 0x19 字符。