標籤:http os 使用 ar strong 檔案 art div sp
[Shell學習筆記] sort、uniq命令對文本進行排序、單一和重複操作文章目錄[隱藏]
sort是在Linux裡非常常用的一個命令,它將檔案進行排序,並將排序結果標準輸出。sort命令既可以從特定的檔案,也可以從stdin中擷取輸入。
sort命令文法
sort 選項 參數
常用選項
- -b:忽略每行前面開始處的空白字元;
- -c:檢查檔案是否已經按照順序排序,排序過為真;
- -d:排序時,處理英文字母、數字和空白字元,以字典順序排序。忽略其他所有字元;
- -f:排序時,將小寫字母視為大寫字母;
- -i:排序時,處理040~176之間的ASCII字元,忽略其他所有字元;
- -m:將幾個排序好的檔案進行合并;
- -M:將前面3個字母按月份的縮寫進行排序;
- -n:按照數值大小進行排序;
- -o outfile.txt:將排序後的結果存入outfile.txt;
- -r:以相反的順序進行排序;
- -k:指定需要排序的列數(欄數);
- -t 分隔字元:指定排序時所用到的欄位分隔字元;
- + 起始欄位 - 結束欄位:以指定的欄位來排序,範圍從起始欄位到結束欄位的前一欄位。(古老的用法)
sort常見用法
sort將檔案/文本的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
[[email protected] text]# cat sort.txtaaa:10:1.1ccc:30:3.3ddd:40:4.4bbb:20:2.2eee:50:5.5eee:50:5.5[[email protected] text]# sort sort.txtaaa:10:1.1bbb:20:2.2ccc:30:3.3ddd:40:4.4eee:50:5.5eee:50:5.5
忽略相同行使用-u選項或者uniq:
[[email protected] text]# cat sort.txtaaa:10:1.1ccc:30:3.3ddd:40:4.4bbb:20:2.2eee:50:5.5eee:50:5.5[[email protected] text]# sort -u sort.txtaaa:10:1.1bbb:20:2.2ccc:30:3.3ddd:40:4.4eee:50:5.5或者[[email protected] text]# uniq sort.txtaaa:10:1.1ccc:30:3.3ddd:40:4.4bbb:20:2.2eee:50:5.5
sort的-n、-r、-k、-t選項的使用:
[[email protected] text]# cat sort.txtAAA:BB:CCaaa:30:1.6ccc:50:3.3ddd:20:4.2bbb:10:2.5eee:40:5.4eee:60:5.1#將BB列按照數字從小到大順序排列:[[email protected] text]# sort -nk 2 -t: sort.txtAAA:BB:CCbbb:10:2.5ddd:20:4.2aaa:30:1.6eee:40:5.4ccc:50:3.3eee:60:5.1#將CC列數字從大到小順序排列:[[email protected] text]# sort -nrk 3 -t: sort.txteee:40:5.4eee:60:5.1ddd:20:4.2ccc:50:3.3bbb:10:2.5aaa:30:1.6AAA:BB:CC# -n是按照數字大小排序,-r是以相反順序,-k是指定需要愛排序的欄位,-t指定欄位分隔字元為冒號
-k選項的具體文法格式:
-k選項的文法格式:
FStart.CStart Modifie,FEnd.CEnd Modifier-------Start--------,-------End-------- FStart.CStart 選項 , FEnd.CEnd 選項
這個文法格式可以被其中的逗號(“,”)分為兩大部分,Start部分和End部分。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start部分的FStart和C.Start。C.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字元開始算“排序首字元”。同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最後一個字元。或者,如果你將CEnd設定為0(零),也是表示結尾到“域尾”。
從公司英文名稱的第二個字母開始進行排序:
$ sort -t ‘ ‘ -k 1.2 facebook.txtbaidu 100 5000sohu 100 4500google 110 5000guge 50 3000
使用了-k 1.2,表示對第一個域的第二個字元開始到本域的最後一個字元為止的字串進行排序。你會發現baidu因為第二個字母是a而名列榜首。sohu和 google第二個字元都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。guge只能屈居第四了。
只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序:
$ sort -t ‘ ‘ -k 1.2,1.2 -nrk 3,3 facebook.txtbaidu 100 5000google 110 5000sohu 100 4500guge 50 3000
由於只對第二個字母進行排序,所以我們使用了-k 1.2,1.2 的表示方式,表示我們“只”對第二個字母進行排序。(如果你問“我使用-k 1.2怎麼不行?”,當然不行,因為你省略了End部分,這就意味著你將對從第二個字母起到本域最後一個字元為止的字串進行排序)。對於員工工資進行排 序,我們也使用了-k 3,3,這是最準確的表述,表示我們“只”對本域進行排序,因為如果你省略了後面的3,就變成了我們“對第3個域開始到最後一個域位置的內容進行排序” 了。
uniq命令
uniq命令常用語報告或者消除檔案中的重複內容,一般與sort命令結合使用。
命令選項
- -c:在每行開頭顯示重複行出現的次數;
- -d:僅顯示重複的列;
- -f 欄位:忽略指定的欄;
- -s N:指定可以跳過前N個字元;
- -w 字元位元:指定用於比較的最大字元數;
- -u:僅顯示出現一次的行列;
uniq用法
重複資料刪除行:
uniq file.txtsort file.txt | uniqsort -u file.txt
只顯示單一行:
uniq -u file.txtsort file.txt | uniq -u
統計各行在檔案中出現的次數:
sort file.txt | uniq -c
在檔案中找出重複的行:
sort file.txt | uniq -d
shell命令之sort