shell快速排序、去重文本內容

    逛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的對齊,看上去這麼怪。。

相關文章
相關標籤/搜索