Sort

當同時選擇列與同時選擇列時,Bash 數字排序會給出不同的結果

  • July 26, 2018

對於以下範例數據,兩列都是數字,但第二列的位數不同。

2 9
1 1000
1 50
3 0

我想根據兩列進行排序。用數字標誌單獨指定它們-n會產生我想要的結果。

sort -n -k1,1 -k2,2 num.data.txt

1 50
1 1000
2 9
3 0

這就是我想要的。

然而,

sort -n -k1,2 num.data.txt

給出似乎按字母順序排序的數據:

1 1000
1 50
2 9
3 0

我知道這sort -n -k1,2 num.data.txtsort -n num.data.txt只有兩列時(給出相同的結果)相同,但我實際使用的數據有更多列。

為什麼這兩種方法之間存在這種差異?

-k1,2鍵規範指定一個鍵,該鍵從第一列的開頭開始(包括前導空白,因為預設的列分隔符是從非空白到空白的過渡)並在第二列的末尾結束。

重要的是要意識到它只是一把鑰匙。如果您需要兩個鍵,則需要兩個-k選項。排序時,sort會將"1 50"字元串與"1 1000"數字進行比較。對於數字比較,通過考慮看起來像有效數字的前導部分(忽略前導空格)將這些字元串轉換為數字。所以我們將比較11。當它們相等時,sort將恢復到備份排序來確定關係,這是對整行的詞法比較。

With -n -k1,1 -k2,2,sort比較and 然後因為它是"1"平局"1",考慮第二個鍵(" 50"vs " 1000")。由於它是數字排序,-n -k1 -k2因此也可以使用(其中-k1指定從第一個欄位開始並在行尾結束的鍵,與整行相同)。

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