sort --unique -k 是否按原始顺序删除重复项?

sort --unique -k 是否按原始顺序删除重复项?

我正在对一组串联的索引文件进行唯一排序,其中第一列有时会在每个索引之间发生变化,第二列将是键值(实际上是十六进制地址)。每个 indexN 文件迭代都会记录自前一个文件以来更改的地址 - 如果地址 0xaa11 存在于索引 3 中,则在合并+排序的输出中,它应该替换来自索引 1 和索引 2 的 0xaa11 地址引用。

问题是,我可以进行这种类型的合并吗可靠地如果我只是按照特定顺序sort通过管道传输每个源索引,那么可以使用 GNU 这样的工具吗?sort -u

例如,管道索引从最新到最旧:

cat index3 index2 index1 | sort -u -k 2,2

当我对此进行测试时,它似乎确实保留了index3中包含也出现在index2和index1中的地址的行,同时删除了来自index2和index1的重复引用。

但那会不会总是是这样吗?手册sort页对此含糊其辞:

-u --unique   output only the first of an equal run

我对 GNU 排序算法了解不够,无法预测具有匹配键的行是否总是按照其源文件连接的顺序(例如它们在源流中出现的顺序)进行排序。但我确实知道排序算法并不总是以线性方式工作。这就是为什么我正在寻求澄清文档似乎暗示的内容。

答案1

sort不保证行的顺序就其目的而言是相等的,除非您使用开关明确请求这一点-s--stable:通过禁用最后手段比较来稳定排序) - 稳定的排序算法是一种不会改变相等项的原始顺序的算法。

但是,那信息页通知我们-u“还禁用默认的最后手段比较”,所以是的,你应该没问题,但从联机帮助页来看这完全不明显。

相关内容