对未按预期行为的竖线分隔字段进行排序
sort on pipe-delimited fields not behaving as expected
考虑这个小文本文件:
ab
a
如果我们运行它通过sort(1),我们得到
a
ab
因为 a
当然在 ab
之前。
但现在考虑这个文件:
ab|c
a|c
如果我们 运行 它通过 sort -t'|'
,我们再次期望 a
在 ab
之前排序,但事实并非如此! (在你的 Unix 版本下试试看。)
我认为这里发生的是 sort
的 -t
选项并不是 真正的 分隔字段——它可能正在改变方式 (比方说)会找到字段 2 的开始,但它不会改变字段 1 结束 的方式。 a|c
排在 ab|c
之后,因为 '|'
在 ASCII 中排在 'b'
之后。 (就好像 -t'|'
参数被忽略了,因为没有它你会得到相同的结果。)
那么这是 sort
中的错误还是我理解的错误?有没有办法正确排序第一个竖线分隔的字段?
这个问题是在我试图回答另一个 SO 问题时提出的,。
sort
的默认行为是将字段 1 到行尾的所有内容视为排序关键字。如果您希望它首先在字段 1 上排序,然后在字段 2 上排序,则需要明确指定。
$ sort -k1,1 -k2,2 -t'|' <<< $'ab|c\na|c'
a|c
ab|c
考虑这个小文本文件:
ab
a
如果我们运行它通过sort(1),我们得到
a
ab
因为 a
当然在 ab
之前。
但现在考虑这个文件:
ab|c
a|c
如果我们 运行 它通过 sort -t'|'
,我们再次期望 a
在 ab
之前排序,但事实并非如此! (在你的 Unix 版本下试试看。)
我认为这里发生的是 sort
的 -t
选项并不是 真正的 分隔字段——它可能正在改变方式 (比方说)会找到字段 2 的开始,但它不会改变字段 1 结束 的方式。 a|c
排在 ab|c
之后,因为 '|'
在 ASCII 中排在 'b'
之后。 (就好像 -t'|'
参数被忽略了,因为没有它你会得到相同的结果。)
那么这是 sort
中的错误还是我理解的错误?有没有办法正确排序第一个竖线分隔的字段?
这个问题是在我试图回答另一个 SO 问题时提出的,
sort
的默认行为是将字段 1 到行尾的所有内容视为排序关键字。如果您希望它首先在字段 1 上排序,然后在字段 2 上排序,则需要明确指定。
$ sort -k1,1 -k2,2 -t'|' <<< $'ab|c\na|c'
a|c
ab|c