1. 程式人生 > 其它 >sort(20191213蘭毅達)

sort(20191213蘭毅達)

sort常用選項

sort將檔案的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
vim 1.txt
1:datadir=/aaa/zzz:
2:basedir=:cc
4:datadir=/sdfsfsd:dd
3:basedir=/data:gg
vim 2.txt
8848
12345
69218
35
66
vim 3.txt
13
13
3
8
20
1
vim facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

(1)-r 對分類進行次序或者比較求逆

(2)-u 刪除結果中所有複製行

(3)-n 指定分類是域上的資料分類,-n依照數值的大小排序

預設是按照ASCII值進行排序,
sort時會遇到過10比2小的情況,出現這種情況是由於排序程式將這些數字按字元來排序了,排序程式會先比較1和2,顯然1小,所以就將10放在2前面。

(4) sort的-t選項(制定分割符)和-k選項指定列數

列與列之間用冒號隔開了,第一列表示水果型別,第二列表示水果數量,第三列表示水果價格。那麼我想以水果數量來排序,也就是以第二列來排序,如何利用sort實現?幸好,sort提供了-t選項,後面可以設定間隔符。指定了間隔符之後,就可以用-k來指定列數了。
sort -n -k 2 -t ‘:’ facebook.txt #使用-k制定第2列進行排序,
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

(5) sort的-o選項

由於sort預設是把結果輸出到標準輸出,所以需要用重定向才能將結果寫入檔案,形如sort filename > newfile。
但是,如果你想把排序結果輸出到原檔案中,用重定向可就不行了。
sort -r 2.txt -o 2.txt

其他的sort常用選項

-f會將小寫字母都轉換為大寫字母來進行比較,亦即忽略大小寫

-c會檢查檔案是否已排好序,如果亂序,則輸出第一個亂序的行的相關資訊,最後返回1

-C會檢查檔案是否已排好序,如果亂序,不輸出內容,僅返回1
-M會以月份來排序,比如JAN小於FEB等等
-b會忽略每一行前面的所有空白部分,從第一個可見字元開始比較。

如何編寫sort

sort()方法內設定:
1、開啟一個檔案fopen:FILE *fopen(const char *path, const char *mode);
2、讀取這個檔案的每一個數據的函式fread,直到讀取到‘EOF’字元為止,存入一個數組:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
3、一個比較函式compare(a[i], a[i+1]),該函式要比較a[i]和a[i+1]兩個值,然後返回一個用於說明這兩個值的相對順序的數字
4、主函式:輸入對應的引數,對檔案進行排序