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

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

在排序算法里有個(gè)重要的問(wèn)題:是否穩(wěn)定?這個(gè)問(wèn)題指的是:相同的記錄輸入順序是否在輸出時(shí)也可保持原狀?當(dāng)你以多鍵值為記錄進(jìn)行排序,或是以管道處理時(shí),排序穩(wěn)定性就非常重要了.我們先來(lái)驗(yà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)的排序字段都相同,但是輸出與輸入不一致,所以我們說(shuō) sort 不是穩(wěn)定的排序.幸好:我們可以通過(guò)--stable 選項(xiàng)補(bǔ)救這個(gè)問(wèn)題,設(shè)置此選項(xiàng),就會(huì)穩(wěn)定了.

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

輸出為:
one_two
one_two_three
one_two_four
one_two_five
sort 命令的重要性絕對(duì)能在 linux 中拍到前十.

刪除重復(fù)

有時(shí),將數(shù)據(jù)流里連續(xù)重復(fù)的記錄刪除是必要的.使用 sort -u 的消除操作十一局匹配的鍵值,而非匹配的記錄.
uniq 命令提供了另外一種過(guò)濾數(shù)據(jù)的方式:常用于管道中,用來(lái)刪除已使用 sort 排序完成的重復(fù)記錄.

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

從文件中去除或刪除重復(fù)的行,在功能上和 sort -u類似.
常用選項(xiàng):
-u: 只顯示不重復(fù)的行
-d: 只顯示重復(fù)的行
-c: 打印每一行出現(xiàn)的次數(shù)
-fn: 忽略前n個(gè)域
例如:我有一個(gè)文件:unip.txt
tres
unus
duo
tres
duo
tres
使用sort uniq.txt |uniq 命令顯示唯一的,排序后的記錄,重復(fù)則僅取唯一行.
輸出為:
duo
tres
unus
使用sort uniq.txt | uniq -c命令計(jì)數(shù)唯一的,排序后的記錄,說(shuō)白了就是統(tǒng)計(jì)各行文本出現(xiàn)的次數(shù)
2 duo
3 tres
1 unus
代表的意思是說(shuō) 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 相對(duì)于 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ù)行,但是我覺(jué)得 uniq 還是比較方便的一個(gè)。使用 uniq 的時(shí)候要注意以下二點(diǎn)

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

uniq 的所有選項(xiàng):

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