我有一个包含已排序数据的文件,我想根据一个键中的值重新排序该文件,而不破坏其他键中数据的顺序。
如何防止 GNU sort 根据我未指定的键的值执行行排序,或者如何指定 GNU sort 在排序时忽略一系列键?
文件数据.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
答案1
你需要一个稳定排序。从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
or --numeric-sort
(例如,将 10 与 2 与默认的词汇排序顺序进行比较时,您可能会得到意外的结果)。在这种情况下,只需执行以下操作:
sort -sn <data.txt
无需提取第一个字段,因为整行的数字解释将与第一个字段的数字解释相同。
答案2
对于缺少选项的(非 GNU)sort
实现-s
,您始终可以执行以下操作:
<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-
也就是说,在行号前面添加行号以使其成为第二个排序键,然后将其删除。