linux sort uniq命令詳解


sort

功能說明:將文本文件內容加以排序,sort可針對文本文件的內容,以行為單位來排序。

sort [-bcdfimMnr][-o<輸出文件>][-t<分隔字符>][+<起始欄位>-<結束欄位>][--help][--verison][文件]

  -b   忽略每行前面開始處的空格字符 。

  -c   檢查文件是否已經按照順序排序

  -d   排序時,處理英文字母、數字及空格字符外,忽略其他的字符。

  -f   排序時,將小寫字母視為大寫字母。

  -i   排序時,除了040至176之間的ASCII字符外,忽略其他的字符。

  -m   將幾個排序好的文件進行合並。

  -M   將前面3個字母依照月份的縮寫進行排序。

  -n   依照數值的大小排序。

  -o<輸出文件>   將排序后的結果存入指定的文件。

  -r   以相反的順序來排序。

  -t<分隔字符>   指定排序時所用的欄位分隔字符。

  -k  選擇以哪個區間進行排序

  +<起始欄位>-<結束欄位>   以指定的欄位來排序,范圍由起始欄位到結束欄位的前一欄位。

  -u 在輸出行中去除重復行。

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

 
        

舉例:

ls -l|sort -n -k5

-n 表示以數值排序
-k5 表示以第幾列排序
還可以用 -t參數指定行內容的分隔符

源文件:

  • apple
    pear
    orange
    pear
    1
    2
    10

默認排序:

  • 1
    10
    2
    apple
    orange
    pear
    pear

-u 在輸出行中去除重復行。

  • 1
    10
    2
    apple
    orange
    pear

-o 把排序結果輸出到原文件中

使用重定向:sort test.txt>test.txt 后,

test.txt為空

sort test.txt -o test.txt

 

-c 檢查文件是否已經按照順序排序

sort -c 排好序的文件,無返回信息,

echo $?為0

sort -c 未排序文件,有提示信息,

echo $?為1

-n 依照數值的大小排序,

sort 默認情況下會將數字按照字符串來排序,

所以會出現2比10大的情況。

使用-n能避免該情況:sort -n test.txt

  • apple
    orange
    pear
    pear
    1
    2
    10

-t<分隔字符> 指定排序時所用的欄位分隔字符,

-k  選擇以哪個區間進行排序

cat date.txt 
2017-12-02
2017-01-09

sort -n -k 2 -t'-' date.txt 

  • 2017-01-09
  • 2017-12-02

 

其他舉例:

sort -t ' ' -k 3nr -k 2n facebook.txt

先以第3個域進行逆序排序,如果相同,再以第2個域進行排序,n   依照數值的大小排序。

后續學習可參考:http://blog.chinaunix.net/uid-10540984-id-313479.html

uniq

[-cdu][-f<欄位>][-s<字符位置>][-w<字符位置>][--help][--version][輸入文件][輸出文件]

-u或--unique 只保留出現唯一一次的行列。

-d或--repeated 僅顯示重復出現的行列,出現一次的行列不會顯示

-c 在每列旁邊顯示該行重復出現的次數。

-f n 或--skip-fields=n 忽略前N個字段。字段由空白字符(空格符、Tab)分隔

-s<字符位置>或--skip-chars=<字符位置> 忽略比較指定的字符。-s n:忽略前n個字符,從n+1個字符開始比較

-w<字符位置>或--check-chars=<字符位置> 指定要比較的字符。-w n:只比較前n個字符,對每行第n個字符以后的內容不作對照

 -i, --ignore-case     在比較的時候不區分大小寫

[輸入文件] 指定已排序好的文本文件。如果不指定此項,則從標准讀取數據;

[輸出文件] 指定輸出的文件。如果不指定此選項,則將內容顯示到標准輸出設備(顯示終端)。

uniq 是對排序好的內容去重當重復的行並不相鄰時,uniq 命令是不起作用的,所以需要先使用sort排序,在使用uniq去重

舉栗:

原文件

  • e bsd 1000 600 4M
    c win7 2000 100 7G
    d winxp 4000 300 3G
    d winxp 500 300 3G
    g winxp 500 300 3G
    g winxp 500 300 3G
    G WINXP 500 300 3G

uniq -c test_uniq.txt

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    1 d winxp 4000 300 3G
    1 d winxp 500 300 3G
    2 g winxp 500 300 3G
    1 G WINXP 500 300 3G

-u 僅顯示出現一次的行 ,不顯示出現多次的行

uniq -u -c test_uniq.txt 

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    1 d winxp 4000 300 3G
    1 d winxp 500 300 3G
    1 G WINXP 500 300 3G

僅顯示重復出現的行 -d

uniq -d -c test_uniq.txt 

  • 2 g   winxp   500     300 3G

不顯示只出現一次的行

-i 比較的時候不區分大小寫 ,不區分大小寫,所以有三行進行的合並

uniq -i -c test_uniq.txt 

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    1 d winxp 4000 300 3G
    1 d winxp 500 300 3G
    3 g winxp 500 300 3G

比較時忽略前n個字段,從n+1列開始比較 -f n

uniq -c -f 3 test_uniq.txt

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    1 d winxp 4000 300 3G
    4 d winxp 500 300 3G

 

源文件

注意空格符
  • a b 30 3G
  • a h 30  3G
  • a g  30 3G
  • a  ffff  30 3G
  • uniq -c -f 2 test.txt
  1. 1 a b 30 3G
  2. 1 a h 30  3G
  3. 2 a g  30 3G

忽略前2個字段時,前2個字段中的字符以及空格不同都不會有影響,

但是第2個字段之后的空格與字符變化會影響去重效果

比較時忽略前n個字符,從n+1個字符開始比較 -s n

uniq -c -s 1 test_uniq.txt

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    1 d winxp 4000 300 3G
    3 d winxp 500 300 3G
    1 G WINXP 500 300 3G

忽略前1個字符,第4,5,6,行會被認為是一樣的

只比較前n個字符,對每行第n個字符以后的內容不作對照 -w n

uniq -c -w 1 test_uniq.txt

  • 1 e bsd 1000 600 4M
    1 c win7 2000 100 7G
    2 d winxp 4000 300 3G
    2 g winxp 500 300 3G
    1 G WINXP 500 300 3G

指定輸出文件

uniq -c test_uniq.txt  out.txt

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM