我有一个由几行和几列组成的文件。列由 \t 分隔。现在我想根据第二列对文件进行排序,例如sort -f -t$'\t' -k2 file.txt
. 但是,第二列包含以下值:+
、o
和-
。如何进行排序,使其+
位于顶部、o
中间和-
底部?
此外,我还有另一列,比如第 5 列,并且想对该列的文件进行排序。但是,我想指定我的个人顺序,即n
在顶部、s
中间和l
底部。
如果有一个程序可以有效地实现我的目标,我会更喜欢那个解决方案。否则我正在寻找一个自写的函数。
我有一个由几行和几列组成的文件。列由 \t 分隔。现在我想根据第二列对文件进行排序,例如sort -f -t$'\t' -k2 file.txt
. 但是,第二列包含以下值:+
、o
和-
。如何进行排序,使其+
位于顶部、o
中间和-
底部?
此外,我还有另一列,比如第 5 列,并且想对该列的文件进行排序。但是,我想指定我的个人顺序,即n
在顶部、s
中间和l
底部。
如果有一个程序可以有效地实现我的目标,我会更喜欢那个解决方案。否则我正在寻找一个自写的函数。
有一种技术称为 DSU、decorate-sort-undecorate 或 Schwartzian 变换。
基本方法是发明您自己的替代键,它可以是您的数据的任意组合(从您的记录的任何部分提取,可能依赖于其他字段)。这些只需按所需的重要性顺序排列即可。例如,零填充数字字段通常很有帮助。您可以通过将输入行号添加为最终子键来使最终订单稳定。所有记录的总密钥长度需要相同。
然后根据 -k1.1 顺序(整条记录)对它们进行排序。这通常比多键排序更快,因为通常排序将为每次比较重建两个多键。
最后,您通过切断固定长度的装饰来取消装饰排序的输出。
我们仍然可以使用
sort
,以防它是一个大文件:第一个 perl 脚本在第二列变为第五列,
o
以准备排序。,
l
t
第二个 perl 脚本变回来了。