Sort

如何對具有不同數據類型的多個列使用排序

  • July 10, 2022

這是我的製表符分隔文件 t.tsv:

$ cat t.tsv
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -10.74
2022/05/09  -132.60
2022/05/12  -18.56
2022/05/12  -20.20
2022/05/17  -11.00
2022/05/17  -112.91
2022/05/17  -51.43
2022/05/17  -64.78
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

我正在使用 MacOS 12.4 排序(來自手冊頁:排序實用程序符合 IEEE Std 1003.1-2008 (“POSIX.1”) 規範)首先按 alpha seq 升序按 col 1 排序,然後按數字升序按 col2 排序。

$ cat t.tsv|sort --field-separator='\t' --key=1,1 --key=2,2n
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -10.74
2022/05/09  -132.60
2022/05/12  -18.56
2022/05/12  -20.20
2022/05/17  -11.00
2022/05/17  -112.91
2022/05/17  -51.43
2022/05/17  -64.78
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

我很困惑為什麼當第一列相同時,第二列沒有按升序數字順序排序。許多 SE 對同一問題的回答都說(a)您將單個列指定為--key=1,1,並且(b)您可以將選項-n應用於單個鍵定義,例如--key=2,2n.

**更新:**我應該提到我的外殼是bash.

我不知道sort理解\t或其他此類字元表示的實現,您需要使用ANSI-C 引用來代替:

sort --field-separator=$'\t' --key=1,1 --key=2,2n t.tsv

此外,根據這個 macOS 手冊頁,“用於排序的 Apple 手冊頁包括上述所有內容的 GNU 長選項,但這些尚未(尚未)在 macOS 下實現。 ”在最近的 macOS 版本中,兩者--key--field-separator都實現了sort,但我仍然會使用標準的短選項來保證可移植性:

sort -t $'\t' -k 1,1 -k 2,2n t.tsv

上面的命令與 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

引用自:https://unix.stackexchange.com/questions/709252