逛ChinaUnix論壇,經常可看到到日經帖,怎麼快速排序一個文本內容,或者計算某行出現次數。這些問 題大部分均可以經過簡單的sort、uniq命令來解決。ide
首先準備兩個文本spa
cat file1:3d
Boys in Company C :HK :192 :2192orm
Alien :HK :119 :1982排序
The Hill :KL :63 :2972ip
Aliens :HK :532 :4892it
Star Wars :HK :301 :4102io
A Few Good Men :KL :445 :5851class
Toy Story :HK :239 :3972awk
cat file2:
boy took bat home
boy took bat home
girl took bat home
boy took bat home
boy took bat home
dog brought hat home
dog brought hat home
dog brought hat home
sort:
將文件的每一行做爲一個單位,相互比較,比較原則是從首字符向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
經常使用的幾個參數: sort -mnrtku
m:合併文件
n:按數值大小來排序
r:逆序排
t:自定義分隔符來劃分域
k:選定域來排序
u:全文本去重
域至關於列
一、sort -m file1 file2 合併兩個文件
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
boy :took :bat :home
boy :took :bat :home
girl :took :bat :home
boy :took :bat :home
boy :took :bat :home
dog :brought :hat :home
dog :brought :hat :home
dog :brought :hat :home
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
二、-n參數是有時候會排序出現10比2小的狀況,由於sort是直接比較第一個字符,因此要使用-n來進行數值比較。
三、-r參數,sort排序小的排上,大的在下,有時候行數不少,你只想知道最大的就能夠sort -r |more就能夠了。
四、-t參數,選定分隔域符號,這個經常和-k參數一塊兒用,如咱們須要按file1的第三列的數值大小排序
sort -n -t:-k3 file1
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
若是不加-n參數:
sort -t: -k3 file1
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
The Hill :KL :63 :2972
隱藏屬性,sort的輸出都是標準屏幕輸出,若是咱們要輸出到源文件,使用重定向就會杯具。。
sort file1>file1;cat file1,你會獲得一個空文件。這時候要使用-o參數來實現這個功能。
sort file1 -o file1
uniq:
這個命令讀取輸入文件,並比較相鄰的行。在正常狀況下,第二個及之後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不一樣。若是輸入文件用「- 」表示,則從標準輸入讀取。
它與sort -u的區別在於,sort -u是全文本去重,而uniq是比較相鄰行,將第二個及之後更多重複行刪去。
語法:uniq [-cdu][-f<欄位>][-s<字符位置>][-w<字符位置>][--help][--version][輸入文件][輸出文件]
補充說明:uniq可檢查文本文件中重複出現的行列。
參數:
-c或--count 在每列旁邊顯示該行重複出現的次數。
-d或--repeated 僅顯示重複出現的行列。
-f<欄位>或--skip-fields=<欄位> 忽略比較指定的欄位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比較指定的字符。
-u或--unique 僅顯示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比較的字符。
--help 顯示幫助。
--version 顯示版本信息。
經常使用的是-c參數,顯示行的重複出現次數。
uniq -c file2
2 boy :took :bat :home
1 girl :took :bat :home
2 boy :took :bat :home
3 dog :brought :hat :home
但因爲是隻比較相鄰行,因此仍是配合sort先排序一下:
sort file2 |uniq -c
4 boy :took :bat :home
3 dog :brought :hat :home
1 girl :took :bat :home
這樣才獲得咱們想要的結果。
最後再把這兩個文件合併的漂亮一點:
sort -m file1 file2 |sort |uniq -c |sed 's/ //g'|awk -F ":" '{printf ("%-10s %10s %10s %10s\n",$1,$2,$3,$4)}'
1AFewGoodMen KL 445 5851
1Alien HK 119 1982
1Aliens HK 532 4892
1BoysinCompanyC HK 192 2192
4boy took bat home
3dog brought hat home
1girl took bat home
1StarWars HK 301 4102
1TheHill KL 63 2972
1ToyStory HK 239 3972
感受仍是很坑爹。。
一、sort -m竟然只合並,沒有排序
二、printf的對齊,看上去這麼怪。。