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

Wil*_*Wil 9 sort

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

如何防止 GNU sort 根据我未指定的键的值执行行排序,或者如何指定 GNU sort 在排序时忽略一系列键?

文件数据.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A
Run Code Online (Sandbox Code Playgroud)

预期输出:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A
Run Code Online (Sandbox Code Playgroud)

命令:

sort -k 1,1 <data.txt
Run Code Online (Sandbox Code Playgroud)

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

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 23

你需要一个稳定的排序。来自man sort

-s, --stable
       stabilize sort by disabling last-resort comparison
Run Code Online (Sandbox Code Playgroud)

即:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A
Run Code Online (Sandbox Code Playgroud)

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

sort -sn <data.txt
Run Code Online (Sandbox Code Playgroud)

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


Sté*_*las 5

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

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-
Run Code Online (Sandbox Code Playgroud)

也就是说,预先添加行号使其成为第二个排序键,然后将其剥离。