如何对具有不同数据类型的多列进行排序

Cha*_*hap 2 sort numeric-data

这是我的制表符分隔文件 t.tsv:

\n
$ cat t.tsv\n2022/05/05  -258.03\n2022/05/07  -18.10\n2022/05/09  -10.74\n2022/05/09  -132.60\n2022/05/12  -18.56\n2022/05/12  -20.20\n2022/05/17  -11.00\n2022/05/17  -112.91\n2022/05/17  -51.43\n2022/05/17  -64.78\n2022/05/18  -13.96\n2022/05/18  -13.96\n2022/05/18  -7.51\n2022/05/19  -17.08\n2022/05/20  -33.08\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 MacOS 12.4 排序(来自手册页:排序实用程序符合 IEEE Std 1003.1-2008 (\xe2\x80\x9cPOSIX.1\xe2\x80\x9d) 规范)首先按 alpha seq 中的第 1 列进行排序升序,然后按数字升序排列 col2。

\n
$ cat t.tsv|sort --field-separator='\\t' --key=1,1 --key=2,2n\n2022/05/05  -258.03\n2022/05/07  -18.10\n2022/05/09  -10.74\n2022/05/09  -132.60\n2022/05/12  -18.56\n2022/05/12  -20.20\n2022/05/17  -11.00\n2022/05/17  -112.91\n2022/05/17  -51.43\n2022/05/17  -64.78\n2022/05/18  -13.96\n2022/05/18  -13.96\n2022/05/18  -7.51\n2022/05/19  -17.08\n2022/05/20  -33.08\n
Run Code Online (Sandbox Code Playgroud)\n

我很困惑为什么当第一列相同时第二列没有按升序排序。许多 SE 对同一问题的回答都说 (a) 您将单个列指定为--key=1,1,并且 (b) 您可以应用诸如-n单个键定义之类的选项--key=2,2n

\n

更新:我应该提到我的外壳是bash.

\n

ter*_*don 5

我不知道有什么sort实现可以理解\t或其他此类字符表示形式,您需要使用ANSI-C 引用来代替:

sort --field-separator=$'\t' --key=1,1 --key=2,2n t.tsv
Run Code Online (Sandbox Code Playgroud)

另外,根据这个 macOS 手册页,“ Apple 的排序手册页包括上述所有选项的 GNU 长选项,但这些选项(尚未)在 macOS 下实现。 ”在 macOS 的最新版本中, 和--key--field-separator针对sort、但我仍然会使用标准的短选项来保证可移植性:

sort -t $'\t' -k 1,1 -k 2,2n t.tsv
Run Code Online (Sandbox Code Playgroud)

上述命令在 macOS、GNU 和 busybox 中sort返回:

$ sort -t $'\t' -k 1,1 -k 2,2n t.tsv
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -132.60
2022/05/09  -10.74
2022/05/12  -20.20
2022/05/12  -18.56
2022/05/17  -112.91
2022/05/17  -64.78
2022/05/17  -51.43
2022/05/17  -11.00
2022/05/18  -13.96
2022/05/18  -13.96
2022/05/18  -7.51
2022/05/19  -17.08
2022/05/20  -33.08
Run Code Online (Sandbox Code Playgroud)