鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號展開與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴展正則表達式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時間
shell 學(xué)習(xí)五十一天----top 命令查看進程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計算行數(shù), 字數(shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對上一講的總結(jié)和擴展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號 trap

shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令

sort 的其他內(nèi)容以及 uniq 命令

在排序算法里有個重要的問題: 是否穩(wěn)定? 這個問題指的是: 相同的記錄輸入順序是否在輸出時也可保持原狀? 當你以多鍵值為記錄進行排序,或是以管道處理時,排序穩(wěn)定性就非常重要了。我們先來驗證一下。

sort -t_ -k1,1 -k2,2 <<EOF
\> one_two
\> one_two_three
\> one_two_four
\> one_two_five
\>EOF

輸出為:

one_two
one_two_five
one_two_four
one_two_three

每條記錄內(nèi)的排序字段都相同,但是輸出與輸入不一致,所以我們說 sort 不是穩(wěn)定的排序。幸好: 我們可以通過--stable 選項補救這個問題,設(shè)置此選項,就會穩(wěn)定了。

sort --stable -t_ -k1,1 -k2,2 << EOF

輸出為:

one_two
one_two_three
one_two_four
one_two_five

sort 命令的重要性絕對能在 linux 中拍到前十。

刪除重復(fù)

有時,將數(shù)據(jù)流里連續(xù)重復(fù)的記錄刪除是必要的。使用 sort -u 的消除操作十一局匹配的鍵值,而非匹配的記錄。

uniq 命令提供了另外一種過濾數(shù)據(jù)的方式: 常用于管道中,用來刪除已使用 sort 排序完成的重復(fù)記錄。

sort ... | uniq | ...  
uniq [OPTION]… [INPUT [OUTPUT]]

從文件中去除或刪除重復(fù)的行,在功能上和 sort -u 類似。

常用選項:

  • -u: 只顯示不重復(fù)的行
  • -d: 只顯示重復(fù)的行
  • -c: 打印每一行出現(xiàn)的次數(shù)
  • -fn: 忽略前 n 個域

例如: 我有一個文件:unip.txt

tres
unus
duo
tres
duo
tres

使用 sort uniq.txt |uniq 命令顯示唯一的,排序后的記錄,重復(fù)則僅取唯一行。

輸出為:

duo
tres
unus

使用 sort uniq.txt | uniq -c 命令計數(shù)唯一的,排序后的記錄,說白了就是統(tǒng)計各行文本出現(xiàn)的次數(shù)

2 duo
3 tres
1 unus

代表的意思是說 duo 出現(xiàn)了兩次,tres 出現(xiàn)了三次,unus 出現(xiàn)了一次。

使用 sort uniq.txt | uniq -d 命令僅顯示重復(fù)的記錄

輸出結(jié)果為:

duo
tres

使用 sort uniq.txt | uniq -u 命令僅顯示未重復(fù)的記錄

輸出結(jié)果為:unus

  • 并集:cat file1.txt file2.txt | sort | uniq > file.txt
  • 交集:cat file1.txt file2.txt | sort | uniq -d >file.txt
  • 差集:求 file1.txt 相對于 file2.txt 的差集,可先求出兩者的交集 temp.txt,然后在 file1.txt 中除去 temp.txt 即可。
    cat file1.txt file2.txt | sort | uniq -d >temp.txt
    cat file1.txt temp.txt | sort | uniq -u >file.txt

uniq 到底是干嘛用的?

文本中的重復(fù)行,基本上不是我們所要的,所以就要去除掉。linux 下有其他命令可以去除重復(fù)行,但是我覺得 uniq 還是比較方便的一個。使用 uniq 的時候要注意以下二點

  1. 對文本操作時,它一般會和 sort 命令進行組合使用,因為 uniq 不會檢查重復(fù)的行,除非它們是相鄰的行。如果您想先對輸入排序,使用 sort -u。
  2. 對文本操作時,若域中為先空字符 (通常包括空格以及制表符),然后非空字符,域中字符前的空字符將被跳過

uniq 的所有選項:

  • -c, --count // 在每行前加上表示相應(yīng)行目出現(xiàn)次數(shù)的前綴編號
  • -d, --repeated // 只輸出重復(fù)的行
  • -D, --all-repeated // 只輸出重復(fù)的行,不過有幾行輸出幾行
  • -f, --skip-fields=N //-f 忽略的段數(shù),-f 1 忽略第一段
  • -i, --ignore-case // 不區(qū)分大小寫
  • -s, --skip-chars=N // 根 -f 有點像,不過 -s 是忽略,后面多少個字符 -s 5 就忽略后面 5 個字符
  • -u, --unique // 去除重復(fù)的后,全部顯示出來,根 mysql 的 distinct 功能上有點像
  • -z, --zero-terminated end lines with 0 byte, not newline
  • -w, --check-chars=N // 對每行第 N 個字符以后的內(nèi)容不作對照
  • --help // 顯示此幫助信息并退出
  • --version // 顯示版本信息并退出