1. 程式人生 > >第十三章 對文本進行排序、單一和重復操作:sort命令、uniq命令

第十三章 對文本進行排序、單一和重復操作:sort命令、uniq命令

對文本進行排序、單一和重復操作 sort命令 uniq命令

第十三章 對文本進行排序、單一和重復操作:sort命令、uniq命令

sort命令

名字解釋

sort命令 它將文件進行排序,並將排序結果標準輸出。sort命令即可以從特定的文件,也可以從stdin中獲取輸入。

語法

sort (選項) (參數)

選項

  • -b:忽略每行前面開始出的空格字符;
  • -c:檢查文件是否已經按照順序排;
  • -d:排序時,處理英文字母、數字及空格字符外,忽略其他的字符;
  • -f:排序時,將小寫字母視為大寫字母;
  • -i:排序時,除了040-176之間的ASCII字符外,忽略其他的字符;
  • -m:將幾個排序號的文件進行合並;
  • -M:將前面3個字母依照月份的縮寫進行排序;
  • -n:依照數值的大小排序;
  • -o:將排序後的結果存入指定的文件;
  • -r:以相反的順序來排序;
  • -t:指定排序時所用的欄位分隔字符;
  • +<起始欄位>-<結束欄位>:以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
  • -u或--unique:跟-c意思是類似,但是不打印相同的行。

參數

文件:指定待排序的文件列表。

實例

sort將文件/文本的每一行作為一個單位,相互比較,比較原則是從首字符向後,一次按照ASCII碼值進行比較,最後將他們按升序輸出。

[root@ceshi ~]# cat sort.txt     
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5

排序後:
[root@ceshi ~]# sort sort.txt     
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5

忽略相同的行

排序 忽略相同的行:
[root@ceshi ~]# sort -u sort.txt   
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
或者
[root@ceshi ~]# uniq sort.txt 
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5

sort的-n、-r、-k、-t選項的使用:

-n:是按照數字大小排序,

-r是以相反順序,

-k是指定需要排序的欄位,

-t指定欄位分隔符為冒號

[root@ceshi ~]# cat sort2.txt 
AAA:BB:CC
aaa:30:1.6
ccc:50:3.3
ddd:20:4.2
bbb:10:2.5
eee:40:5.4
eee:60:5.1

#將BB列按照數字從小到大順序排列:
[root@ceshi ~]# sort -nk 2 -t: sort2.txt 
AAA:BB:CC
bbb:10:2.5
ddd:20:4.2
aaa:30:1.6
eee:40:5.4
ccc:50:3.3
eee:60:5.1

#將CC列數字從大到小順序排列
[root@ceshi ~]# sort -nk 3 -t: sort2.txt  
AAA:BB:CC
aaa:30:1.6
bbb:10:2.5
ccc:50:3.3
ddd:20:4.2
eee:60:5.1
eee:40:5.4

#-n:是按照數字大小排序,-r是以相反順序,-k是指定需要排序的欄位,-t指定欄位分隔符為冒號

-k選項的具體語法格式:

FStart.CStart Modifie,FEnd.CEnd Modifier
-------Start--------,-------End--------
 FStart.CStart 選項  ,  FEnd.CEnd 選項

這個語法格式可以被其中的逗號,分為兩大部分,Start部分和End部分。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start部分的FStartC.StartC.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart,其中FStart就是表示使用的域,而CStart則表示在FStart域中從第幾個字符開始算“排序首字符”。同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最後一個字符。或者,如果你將CEnd設定為0(零),也是表示結尾到“域尾”。

例子:從公司英文名稱的第二個字母開始進行排序

[root@ceshi ~]# cat company.txt 
sohu 100 3000
google 100 4000
baidu 105 3000
guge 105 2500

#從公司英文名稱的第二個字母開始進行排序
[root@ceshi ~]# sort -t ‘ ‘ -k 1.2 company.txt  
baidu 105 3000
sohu 100 3000
google 100 4000
guge 105 2500
#從公司英文名稱的第三個字母開始進行排序
[root@ceshi ~]# sort -t ‘ ‘ -k 1.3 company.txt  
guge 105 2500
sohu 100 3000
baidu 105 3000
google 100 4000

第1個域 第2個域 第3個域

使用-k 1.2 ,表示對第1個域的第2個字符進行公司名字的排序。

只針對公司英文名稱的第2個字母進行排序,如果有相同的就按照工資進行降序排序:

[root@ceshi ~]# sort -t ‘ ‘ -k 1.2,1.2 -nrk 3,3 company.txt 
google 100 4000
sohu 100 3000
baidu 105 3000
guge 105 2500

-k 1.2,1.2 代表只針對第2個字母進行排序。如果寫成-k 1.2那,就意味著將對從第2個字母起到本域最後一個字符為止的字符串進行排序。

-k 3,3 代表只針對第3個域進行排序。如果寫成-k 3那,就意味著將對從第3個域開始字母起到本域最後一個字符為止的字符串進行排序。

uniq命令

名字解釋

uniq命令 用於報告或忽略文件中的重復行,一般與sort命令結合使用。

語法

uniq (選項) (參數)

選項

  • -c或--count:在每列旁邊顯示該行重復出現的次數;
  • -d或--repeated:僅顯示重復出現的行列;
  • -f<欄位>或--skip-fields=<欄位>:忽略比較指定的字符;
  • -s<字符位置>或--skip-chars=<字符為止>:忽略比較指定的字符;
  • -u或--unique:僅顯示出一次的行列;
  • -w<字符位置>或--check-chars=<字符位置>:指定要比較的字符。

參數

輸入文件:指定要去除的重復行文件。如果不指定選項,則從標準讀取數據;

輸出文件:指定要去除重復行後的內容要寫入的輸出文件。如果不指定選項,則將內容顯示到標準輸出設備。

實例

刪除重復行:

[root@ceshi ~]# cat repeat.txt 
aaaaaaaaaaaa
aaaaaaaaaaaa
bbbbbbbbbbbbbb
bbbbbbbbbb
cccccccccccccc
cccccccc
dddddddddddd
dddddddddddd

#方法一:
[root@ceshi ~]# uniq repeat.txt 
aaaaaaaaaaaa
bbbbbbbbbbbbbb
bbbbbbbbbb
cccccccccccccc
cccccccc
dddddddddddd
#方法二:
[root@ceshi ~]# sort repeat.txt | uniq
aaaaaaaaaaaa
bbbbbbbbbb
bbbbbbbbbbbbbb
cccccccc
cccccccccccccc
dddddddddddd
#方法三:
[root@ceshi ~]# sort -u repeat.txt 
aaaaaaaaaaaa
bbbbbbbbbb
bbbbbbbbbbbbbb
cccccccc
cccccccccccccc
dddddddddddd

只顯示單一行

#方法一:
[root@ceshi ~]# uniq -u repeat.txt 
bbbbbbbbbbbbbb
bbbbbbbbbb
cccccccccccccc
cccccccc

#方法二:
[root@ceshi ~]# sort repeat.txt | uniq -u
bbbbbbbbbb
bbbbbbbbbbbbbb
cccccccc
cccccccccccccc

統計各行在文件中出現的次數:

[root@ceshi ~]# sort repeat.txt | uniq -c
      2 aaaaaaaaaaaa
      1 bbbbbbbbbb
      1 bbbbbbbbbbbbbb
      1 cccccccc
      1 cccccccccccccc
      2 dddddddddddd

在文件中找出重復的行:

[root@ceshi ~]# sort repeat.txt | uniq -d
aaaaaaaaaaaa
dddddddddddd

第十三章 對文本進行排序、單一和重復操作:sort命令、uniq命令