2017-03-01 80 views
1

今天我的一位同事注意到排序命令有些奇怪的行爲,我想知道是否有人知道這個命令的輸出是否是有意或無意的?bash排序-nu導致意想不到的行爲

給定的文件:

ABC_22 
ABC_43 
ABC_1 
ABC_1 
ABC_43 
ABC_10 
ABC_123 

我們正在整理與數字排序的文件,也使它獨一無二的,所以我們運行:

sort file.txt -nu 

輸出是:

ABC_22 

現在,我們知道數字排序在這種情況下不起作用,因爲行不是以數字開頭的(這很好,這僅僅是一個較大的腳本的一部分),但是我本來期望的線沿線的東西更多:

ABC_1 
ABC_10 
ABC_123 
ABC_22 
ABC_43 

有誰知道這是爲什麼不是這樣?如果單獨給出-u或-n選項,那麼排序就會像期望的那樣。

回答

1

你缺少對GNU sort第二個字段指定解極限

sort -nu -t'_' -k2 file 
ABC_1 
ABC_10 
ABC_22 
ABC_43 
ABC_123 

標誌-n對於數字排序,-u對於唯一行和的一部分是將解除限制器設置爲_並在_之後對第二個字段進行排序-k2

1

隨着-nan empty number is zero

排序數字。該數字以每行開頭,由可選的 空白,可選的' - '符號和零個或多個數字可能的 組成,數字由千位分隔符分隔,可選地後跟一個 小數點字符以及零個或多個數字。一個空的數字是 被視爲'0'。

所有這些行在行的開頭都有一個空的數字,因此它們在sort的數字唯一性中都是零。如果您開始使用相同號碼的每條線路,例如1,效果將是相同的。你應該指定字段明確地包含號碼,或者使用版​​本排序(-V):

$ sort -Vu foo 
ABC_1 
ABC_10 
ABC_22 
ABC_43 
ABC_123