在管道分隔的字段上排序不符合预期的行为

时间:2015-06-18 03:28:39

标签: sorting unix sh

考虑这个小文本文件:

ab
a

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

a
ab

因为当然a出现在ab之前。

但现在考虑一下这个文件:

ab|c
a|c

如果我们通过sort -t'|'运行它,我们再次期望aab之前排序,但事实并非如此! (在你的Unix版本下试试看看。)

我认为这里发生的是-t的{​​{1}}选项不是真正分隔字段 - 它可能正在改变(例如)开头的方式将找到字段2,但它不会改变字段1 结束的方式sort之后a|c排序,因为ab|c'|'之后出现在ASCII中。 (它好像忽略了'b'参数,因为如果没有它,你会得到相同的结果。)

这是-t'|'中的错误还是我对它的理解?有没有办法正确排序第一个管道分隔字段?

我试图回答另一个SO问题,Join Statement omitting entries

1 个答案:

答案 0 :(得分:0)

sort的默认行为是将从字段1到行尾的所有内容视为排序键。如果您希望首先对字段1进行排序,然后对字段2进行排序,则需要明确指定。

$ sort -k1,1 -k2,2 -t'|' <<< $'ab|c\na|c'
a|c
ab|c