![sort --unique -k 是否按原始顺序删除重复项?](https://linux22.com/image/142467/sort%20--unique%20-k%20%E6%98%AF%E5%90%A6%E6%8C%89%E5%8E%9F%E5%A7%8B%E9%A1%BA%E5%BA%8F%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E9%A1%B9%EF%BC%9F.png)
我正在对一组串联的索引文件进行唯一排序,其中第一列有时会在每个索引之间发生变化,第二列将是键值(实际上是十六进制地址)。每个 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
“还禁用默认的最后手段比较”,所以是的,你应该没问题,但从联机帮助页来看这完全不明显。