Sort
如何對具有不同數據類型的多個列使用排序
這是我的製表符分隔文件 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