同文字檔案打交道的過程中,會遇到各種各樣的與重複和順序相關的任務,比較常用的就是sort、uniq,然後對文字的基本統計就是wc這個工具了。sort命令能夠對檔案和stdin進行各種排序,uniq一般與sort結合使用來提取單一的行。sort和uniq結合能夠用來查詢重複資料。
sort按照指定的引數進行排序,支援按照數字排序和字典順序排序。
排序的選項如下:
其中選項「-n」是使用數字進行排序(預設是按照文字字典順序排序的)。還有更多額外選項可供選擇:
對於具有類似**形式的檔案來說,可以給定字段分隔符後,對指定字段進行排序,這是非常有效的功能。其中「-k」指定進行排序的字段,「-t」指定排序欄位的分隔符(預設為tab鍵)。
user@ubuntu
:~$ cat /etc/passwd | sort -t ":" -k 3
root:x:0
:0:root
:/root
:/bin/bash
user:
x:10:12
:.....
....
sort支援多種排序順序,-d指定字典順序,-f忽略大小寫,-i忽略不可列印字元,-h依據人類可讀數值排序(3k、1g等),-n指定數值排序,-r指定逆序,-r使用隨機排序,-m指定按月份排序。
user@ubuntu
:~$ sort -nr file.txt
user@ubuntu
:~$ sort -m file.txt
user@ubuntu
:~$ sort -r file.txt
對於乙個是否排序過的檔案,可以使用-c選項進行檢測,另外,對於多個已經排過序的檔案,可以使用-m選項進行合併。
user@ubuntu
:~$ sort -m sorted1 sorted2
sort -c file;
if [ $? -eq
0 ]; then
echo sorted!;
else
echo unsorted!;
fi
在使用sort排序完成之後,對於完全相同的行會連續排列在一起,為了去除這些重複的行,uniq工具就是專為此準備的:將連續的重複行刪除只顯示一行。
uniq只能使用排序過的資料輸入,因此uniq要麼使用管道,要麼使用排序過的檔案,以這種方式與sort命令結合起來使用。
除了基本的從排過序的檔案中去除重複行的功能外,還提供了其他選項增強了這個命令的功能。-u選項只輸出唯一的行,-d選項只輸出重複的行,-c選項可以為每一行加上出現的次數的字首。
user@ubuntu
:~$ echo -e "bash\ntest\ntest\nroot" | uniq -u
bash
root
user@ubuntu
:~$ echo -e "bash\ntest\ntest\nroot" | uniq -d
test
user@ubuntu
:~$ echo -e "bash\ntest\ntest\nroot" | uniq -c
1 bash
2 test
1 root
使用上述的-c選項就可以有多重活用,最常用的就是統計檔案詞頻資訊,基本步驟就是將檔案所有連續空格壓縮為乙個,然後將所有空格替換為換行符使得每乙個單詞變為單獨一行。最後使用sort進行排序使得相同單詞連續排布以及uniq -c進行統計。
user@ubuntu:~$ echo
-e"bash\ntest a bash\ntest\nroot" | tr -s
' ''\n' | sort | uniq -c
1 a2 bash
1 root
2 test
另外可以使用-s和-w來指定鍵:-s跳過前n個字元,-w指定用於比較的最大字元數。這樣就可以對某個字段進行排序了。
最後乙個例項,可以使用uniq得出字串樣式。任何乙個字串,只要乙個字元重複出現就在前面加上它出現過的次數。
user@ubuntu
:~$ echo abcbhdccd | sed 's/[^\n]/&\n/g' | sed '/^$/d' | sort | uniq -c | tr -d ' \n'
1a2b3c2d1h
wc命令就是word count的簡稱,顧名思義就是對檔案進行基本的單詞統計。
wc的預設是按照行數、單詞、字元、位元組、最長的行的長度這個順序列印出檔案的統計資訊。從上述選項中可以看出,我們可以指定不所需要的資訊輸出。
不管是指定乙個還是多個需要輸出的選項,各自的輸出相對順序是不變的。
user@ubuntu
:~$ echo -e "this is a new line \nsecond line" | wc -l
2user@ubuntu
:~$ echo -e "this is a new line \nsecond line" | wc -w
7user@ubuntu
:~$ echo -e "this is a new line \nsecond line" | wc -c
32user@ubuntu
:~$ echo -e "this is a new line \nsecond line" | wc -l
19
(6)排序之堆排序
文章 靜默空間 堆的概念 在介紹堆排序之前,首先需要說明一下,堆是個什麼玩意兒。堆是一棵順序儲存的完全二叉樹。其中每個結點的關鍵字都不大於其孩子結點的關鍵字,這樣的堆稱為小根堆。其中每個結點的關鍵字都不小於其孩子結點的關鍵字,這樣的堆稱為大根堆。舉例來說,對於n個元素的序列當且僅當滿足下列關係之一時...
排序演算法 6 排序演算法總結
前面幾篇部落格分別羅列和總結了近期學習的幾種排序演算法,今天總結一下。排序演算法 概述 氣泡排序 選擇排序 排序演算法 直接插入排序 希爾排序 排序演算法 堆排序 排序演算法 快速排序 排序演算法 合併排序 計算的複雜度 依據排序資料量的大小 n 好的表現是o nlogn 最差表現為o n2 系統資...
leetcode經典題目(6) 排序
1.陣列中的第k個最大元素 no.215 題目描述 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。解題思路 對陣列進行排序,返回第k個最大的元素。1 可以使用排序函式sort,時間複雜度 o nlogn 空間複雜度 o 1...