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

问题描述 投票:0回答:2

我想知道是否可以使用十六进制值作为 Unix

sort
实用程序的分隔符。 基本上我想做一些类似的事情:

sort -t '\x00' <input

但是如果我按照上面的方式做是不行的。

unix sorting
2个回答
5
投票

如果您阅读 GNU

sort
手册,您会发现:

-t separator
--field-separator=separator

在每个字段中查找排序键时,使用字符分隔符作为字段分隔符 线。默认情况下,字段由非空白之间的空字符串分隔 字符和空白字符。默认情况下,空白是空格或制表符,但是 LC_CTYPE 语言环境可以改变这一点。 也就是说,给定输入行

foo bar
,排序将其分为字段
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 @ 执行此操作;外壳 (

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

遗憾的是,这不是您正在寻找的。


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 字符。

© www.soinside.com 2019 - 2024. All rights reserved.