Linux
使用 sort 和 comm 的問題
我試圖找到兩個普通數據文件的交集,並從以前的文章中發現它可以通過
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
順序comm
由sort
的預設順序字典排序提供。
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