Linux

使用 sort 和 comm 的問題

  • October 18, 2019

我試圖找到兩個普通數據文件的交集,並從以前的文章中發現它可以通過

comm -12 <(sort test1.list) < (sort test2.list)

在我看來,sort test1.list旨在按順序對 test1.list 進行排序。為了了解如何sort工作,我嘗試sort了以下文件 test1.list 為sort test1.list > test2.list

100
-200
300
2
92
15
340

然而,事實證明 test2.list 是

100
15
2
-200
300
340
92

這個重新排序的列表讓我很困惑這種排序是如何工作的,以及排序和通信是如何一起工作的。

根據comm手冊,“在使用 comm' 之前,必須使用 LC_COLLATE’ 語言環境指定的整理順序對輸入文件進行排序。”

手冊:“除非另有sort說明,否則所有比較都使用 ‘LC_COLLATE’ 語言環境指定的字元整理順序。

因此,快速測試確認,預期的LC_COLLATE順序commsort的預設順序字典排序提供。

sort可以以多種方式對文件進行排序:

  • -d: 字典順序 - 忽略除空格和字母數字以外的任何內容。
  • -g:一般數字 - alpha,然後是負數,然後是正數。
  • -h:人類可讀 - 負面,阿爾法,正面。n < nk = nK < nM < nG
  • -n:數字 - 負數、alpha、正數。k, M,G等並不特殊。
  • -V:版本 - 正面、大寫、較低、負面。1 < 1.2 < 1.10
  • -f: 不區分大小寫。
  • -R:隨機 - 隨機輸入。
  • -r:反向 - 通常與其中之一一起使用dghnV

當然,還有其他選項,但這些是您可能會看到或需要的選項。

您的測試表明預設排序順序可能是-d字典順序。

 d   |   g   |   h   |   n   |   V 
------+-------+-------+-------+-------
 1   |  a    | -1G   | -10   |  1
-1   |  A    | -1k   | -5    |  1G
 10  |  z    | -10   | -1    |  1g
-10  |  Z    | -5    | -1g   |  1k
 1.10| -10   | -1    | -1G   |  1.2
 1.2 | -5    | -1g   | -1k   |  1.10
 1g  | -1    |  a    |  a    |  5
 1G  | -1g   |  A    |  A    |  10
-1g  | -1G   |  z    |  z    |  A
-1G  | -1k   |  Z    |  Z    |  Z
 1k  |  1    |  1    |  1    |  a
-1k  |  1g   |  1g   |  1g   |  z
 5   |  1G   |  1.10 |  1G   | -1
-5   |  1k   |  1.2  |  1k   | -1G
 a   |  1.10 |  5    |  1.10 | -1g
 A   |  1.2  |  10   |  1.2  | -1k
 z   |  5    |  1k   |  5    | -5
 Z   |  10   |  1G   |  10   | -10

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