使用GNU排序按单个键排序/防止对其他键进行不必要的排序


9

我有一个包含已排序数据的文件,我想根据一个键中的值对文件重新排序,而又不破坏其他键中数据的顺序。

如何防止GNU排序根据未指定的键的值执行行排序,或者如何指定GNU排序以在排序时忽略键的范围?

文件data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

预期产量:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

命令:

sort -k 1,1 <data.txt

结果:我没有要求的不需要的排序:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

Answers:


21

您需要稳定的排序。来自man sort

-s, --stable
       stabilize sort by disabling last-resort comparison

即:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

请注意,您可能还需要一个-n--numeric-sort键(如果您的键是数字键)(例如,将10与2与默认的-词法-排序顺序进行比较时,可能会得到意外的结果)。在这种情况下,这只是一个问题:

sort -sn <data.txt

无需提取第一个字段,因为整行的数字解释将与第一个字段相同。



我阅读了文档,但对“稳定”的正确定义引起了我的注意。感谢您快速,简明和引人注目的回复。真实数据的第一个键是本地化的字符串,因此数字对我不起作用。
威尔

4

对于sort缺少-s选项的(非GNU)实现,您始终可以执行以下操作:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

也就是说,在行号前添加它作为第二个排序键,然后将其剥离。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.