对未按预期行为的竖线分隔字段进行排序

sort on pipe-delimited fields not behaving as expected

考虑这个小文本文件:

ab
a

如果我们运行它通过sort(1),我们得到

a
ab

因为 a 当然在 ab 之前。

但现在考虑这个文件:

ab|c
a|c

如果我们 运行 它通过 sort -t'|',我们再次期望 aab 之前排序,但事实并非如此! (在你的 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