我正在对一组连接的索引文件进行唯一排序,其中第一列有时会在每个索引之间更改,第二列将是键值(实际上是十六进制地址)。每个 indexN 文件迭代记录自上一次以来更改的地址——如果地址 0xaa11 存在于 index3 中,则在合并+排序的输出中,它应该替换来自 index1 和 index2 的 0xaa11 地址引用。
问题是,如果我只是按特定顺序将每个源索引传输到管道,我能否使用 GNU 之类的工具可靠地进行这种类型的合并?sort
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 排序的算法知之甚少,无法预测具有匹配键的行是否总是按其源文件连接的相同顺序排序(例如,它们出现在源流中的顺序)。但我确实知道排序算法并不总是以线性方式工作。这就是为什么我正在寻找澄清文档似乎暗示的内容。
sort
不保证行的顺序就其目的而言是相等的,除非您使用-s
开关明确请求这一点(--stable
: 通过禁用最后的比较来稳定排序)——一种稳定的排序算法不会改变相等项目的原始顺序.但是,信息页面告诉我们
-u
“也禁用了默认的最后手段比较”,所以是的,你应该没问题,但从手册页上看完全不明显。