天天看點

檔案的排序和合并--sort,cut,tr等指令應用

本文章的内容隻對文本進行編輯,但結果并不會把原檔案内容更改

sort指令,隻是對檔案排行排序

選項意義

-c 測試檔案是否已經被排序

-k 指定排序的區域(常用)

-m 合并兩個已排序的檔案

-n 根據數字大小進行排序(常用)

-o 将輸出寫到指定檔案,相當于重定向輸出檔案

-r 将排序結果逆向顯示

-t 改變區域分隔符(常用)

-u 去除結果中的重複行

格式:sort 選項輸入檔案

下面詳細解說:

-t選項——原理從第一區域開始排序,若第一區域内容相同,則以第二區域排序

-k

可以留意到,從第三區域才開始排序,前2個區域是沒有排序,而-t就以:為分隔符

也可以用sort -t: -k3 /etc/passwd

這樣第3區域剛好是UID就會排序,但會發現這裡隻以第一個字元大小進行排序,而不會以整體大小排序

如:這樣隻達到第1個字元進行排序,而不是對整個數進行排序

1 1

400 400

67 501

89 602

501 67

602 89

-n選項,為指定列的數字大小,屬于整體性質來排序

如:

900 3

60 60

3 100

100 900

可以看出,加了-n是對整體排序,而不加-n則隻以單個字元排序

是以用 sort -t: -k3n /etc/passwd 這樣就可以對UID進行從小到大排序了

-r是反向,從大到小排序

-u選項,去除重複出現的區域

其中重複了2行的900:aa就不會顯示出來

-o為定向輸出,但直接用>來代替就行了,這個選項很少用

-m為排序後2個檔案合并,前提2個檔案内容沒有重複

這樣就把abc的内容全部到aaa裡了

其實還可以簡寫為sort -t: abc aaa 就行了

也可以按2個檔案的區域進行排序

這樣就達到2個檔案内容合并後再進行區域排序

sort指令就介紹到這裡

uniq指令——用于去除重複行,其實跟sort -u差不多

-c 列印每行在文本中重複出現的次數

-d 隻顯示有重複的記錄,每個重複記錄隻出現一次

-u 隻顯示沒有重複的記錄

去除2行重内容

與sort -u的差別,sort -u隻會把重複行删除剩下1個

可以留意到,uniq隻是把連續重複的行删除,第4行的555:rr是沒有删除,但sort -u則認為都是重複,是以一并删除

-C為列印文本中出現重複的次數

可以顯示出重複的次數

-d隻列印連續重複的記錄

隻顯示出連續重複的行記錄

-u隻列印沒有連續重複的記錄

其實-d和-u是正反向的對比效果

cut指令——用于從标準輸入或文本檔案中按區域或行提取文本

格式:cut 選項檔案

-c 指定提取的字元數或字元範圍

-f 指定提取的區域數或範圍

-d 改變區域分隔符

-c1隻提取abc檔案中第一個字元的列,而-c1-5即代表1-5個字元的列,-c2,4即代表第2和第4個字元的列

-d指定分隔符,-f為指定區域,這2個參數通常要一起使用

感覺跟awk的截取差不多

空格也可以用cut -d “ ” 來表示

使用cut來截取IP也行

這方法的原理跟awk一樣,就是先過濾IP字段,再以:為分區過濾,再過濾出第1區域

也可以結合sort來使用對UID進行排序

這樣就把UID部分單獨截取出來進行排序,當然用awk也能實作的

paste指令——把兩個檔案内容粘貼一起

-d 指定分隔符,預設是以tab鍵為分隔符

-s 将每個檔案粘貼成一行

可以留意到粘貼後,是以空格為分隔符

當然也可以排粘貼後的結果輸出到另一個檔案也行

-d為指定分隔,因為預設是以tab鍵為分隔符,現在改變了分隔符?,注意,分隔符隻能指定1個字元,不能指定多個字元,如-d***,這樣的效果隻能是-d*

-s可以排兩個檔案以的内容分别以一行方式排列再合并,但效果不好看

tr指令——實作字元轉換功能,其功能類似于sed指令,但tr指令比較簡單

格式:tr 選項字元串1 字元串2 <标準輸入檔案,也可以使用管道

-c 標明字元串1中字元集的補集,即反選字元串1中的字元集

-d 删除字元串1中出現的所有字元(常用)

-s 删除所有重複出現的字元序列,隻保留一個

tr指令要麼在管道後面使用,要麼在标準輸入”<”使用

從abc中标準輸入,然後比對到555字元串就删除,-d是删除字元串

[root@localhost~]# cat abc

555:rRAd

60:bB

heLLo:333

[root@localhost~]# tr -d A-Z < abc

555:rd

60:b

heo:333

從abc文本中删除大寫A-Z範圍的字元串

同理,也可以删除數字0-9的範圍

這樣0-9範圍的數字就被删除

-s為删除重複的字元,隻保留1個

指定的條件是a,b這兩個重複的字元,然後删除重複隻保留1個

删除文本中有多個空白行

把空白行都删除,這裡\n是代表換行的意思

也可以指定範圍進行删除

可以看到,隻删除剩1個的重複字元

若上面的指令改成 tr “[a-z][0-9]” < abc

這也可以比對凡是大寫的字元都更改為9,注意更改的字元隻能是單個,不能是多個,如:

tr“[A-Z]” “999” < abc 這樣的效果也隻能替換1個9的字元而不能是多個

使用管道方式用tr指令

這樣比對19的字元都全部删除

檔案的排序、合并就介紹到這裡