1. 程式人生 > >Shell檔案的排序、合併和分割

Shell檔案的排序、合併和分割

sort

sort [option] inputfile
選項及其意義:

option desc
-b 忽略每行前面開始出的空格字元;
-c 檢查檔案是否已經按照順序排序;
-d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元;
-f 排序時,將小寫字母視為大寫字母;
-i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元;
-m 將幾個排序號的檔案進行合併;
-M 將前面3個字母依照月份的縮寫進行排序;
-n 依照數值的大小排序;
-o<輸出檔案> 將排序後的結果存入制定的檔案;
-r 以相反的順序來排序;
-t<分隔字元> 指定排序時所用的欄位分隔字元;預設是空格符
+<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
-k\< num > 指定排序域。1表示第一域,2表示第二域。
-u 對結果進行去重

e.g.
sort -t: -k3n inputfile

-k的使用
-k選項的語法格式:

FStart.CStart Modifie,FEnd.CEnd Modifier
-------Start--------,-------End-------- 
FStart.CStart 選項 , FEnd.CEnd 選項

這個語法格式可以被其中的逗號,分為兩大部分,Start

部分和End部分。Start部分也由三部分組成,其中的Modifier部分就是我們之前說過的類似n和r的選項部分。我們重點說說Start部分的FStart和C.Start。C.Start也是可以省略的,省略的話就表示從本域的開頭部分開始。FStart.CStart,其中FStart就是表示使用的域而CStart則表示在FStart域中從第幾個字元開始算“排序首字元”。同理,在End部分中,你可以設定FEnd.CEnd,如果你省略.CEnd,則表示結尾到“域尾”,即本域的最後一個字元。或者,如果你將CEnd設定為0(零),也是表示結尾到“域尾”。
e.g.

#從公司英文名稱的第二個字母開始進行排序
$ sort -t ' ' -k 1.2 facebook.txt 
baidu 100 5000 
sohu 100 4500 
google 110 5000 
guge 50 3000

#只針對公司英文名稱的第二個字母進行排序,如果相同的按照員工工資進行降序排序

$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt 
baidu 100 5000 
google 110 5000 
sohu 100 4500 
guge 50 3000

uniq

uniq [option] inputfile
選項及其意義:

option desc
-c或——count 在每列旁邊顯示該行重複出現的次數;
-d或–repeated 僅顯示重複出現的行列; 每個記錄僅顯示一次
-f<欄位>或–skip-fields=<欄位> 忽略比較指定的欄位;
-s<字元位置>或–skip-chars=<字元位置> 忽略比較指定的字元;
-u或——unique 僅顯示出不重複的行列;
-w<字元位置>或–check-chars=<字元位置> 指定要比較的字元。

e.g.

uniq 與 sort -u的區別

  • sort -u所有的重複行都會被去除。
  • uniq 去除的重複行必須是連續出現的。

join

join [option] file1 file2
選項及其意義:
option|desc
-|-
-a<1或2>:除了顯示原來的輸出內容之外,還顯示指令檔案中沒有相同欄位的行; 相當於left join ,right join
-e<字串>:若[檔案1]與[檔案2]中找不到指定的欄位,則在輸出中填入選項中的字串;
-i或–ignore-case:比較欄位內容時,忽略大小寫的差異;
-o<格式>:按照指定的格式來顯示結果;
-t<字元>:使用欄位的分割字元;
-v<1或2>:更-a相同,但是隻顯示檔案中沒有相同欄位的行;
-1<欄位>:連線[檔案1]指定的欄位; -2<欄位>:連線[檔案2]指定的欄位。


  • -a與-v的區別:
    -a顯示顯示匹配的記錄。-v不顯示匹配的記錄。
  • -o
    join預設顯示2個檔案中的所有域,-o用於改變顯示結果。
    bash
    #顯示2個檔案的前2列
    join -t: -o1.1 1.2 2.1 2.2 file1
  • -1,-2
    join預設指定2個檔案的第一個域進行join,-1,-2指定2個檔案進行join的域

cut

cut用於從標準輸入或檔案中按域或行提取資料。
cut [option] file

選項及其意義:

option desc
-c 指定提取的字元數或字元範圍
-f 指定提取的域數或域範圍
-d 改變域分割符

-c格式:

  • -cn :第n個字元
  • -cn,m :第n,m個字元
  • -cn-m :第n至m個字元
    -f格式與-c一樣

paste

paste將標準輸入或檔案中的內容貼上到新的檔案。多個檔案按列對列進行貼上
paste [option] inputfile outfile
選項及其意義:

option desc
-s 每個檔案貼上為一行,預設按列貼上
- 從標準輸入中讀取檔案
-d 改變域分割符,預設是空格或tab

e.g.

#每行顯示5個檔案
ls | past -d“ ” - - - - -

split

用於切割檔案
split [option] input output
選項及其意義:

option desc
-或-l 用於指定檔案切割的行數
-b 用於檔案切割的大小,單位位元組
-C 同-b,但切割時儘量保持每行的完整性
-d 使用數字作為字尾
-a 指定字尾長度,-a 3,長度為3

檔案切割時預設加上編號,aa~zz,當不指定小檔名字時,預設為x。

tr

tr實現字元轉換
tr [option] 字串1 字串2 輸入檔案
選項及其意義:

option desc
-c 選定字串1中的補集,即反選字串1中的補集
-d 刪除字串1中的所有字元
-s 刪除所有重複出現的字元序列,只儲存1個

e.g.

#刪除所有大寫字母
tr -s A-Z file

tr支援部分正則表示式,例如A-Z 0-9 A*3,tr支援POSIX字元以及控制字元

標記 速記符 含義 八進位制方式
\a Ctrl-G 鈴聲 \007
\b Ctrl-H 退格符 \010
\f Ctrl-L 走行換頁 \014
\n Ctrl-J 新行 \012
\r Ctrl-M 回車 \015
\t Ctrl-I tab鍵 \011
\v Ctrl-X \030

注意這些控制字元,如果想在linux下輸入,如我們可能需要輸入^M這種字元,只需ctrl+V+M同時按下即可。

tar

tar [-cxtzjvfpPN] 檔案與目錄 ….

-c:建立一個壓縮檔案的引數指令(create 的意思);
-x:解開一個壓縮檔案的引數指令!
-t:檢視 tarfile 裡面的檔案!
-r:向壓縮歸檔檔案末尾追加檔案
-u:更新原壓縮包中的檔案
這五個是獨立的命令,壓縮解壓都要用到其中一個,可以和別的命令連用但只能用其中一個.
特別注意,在引數的下達中, c/x/t/r/u 僅能存在一個!不可同時存在!因為不可能同時壓縮與解壓縮。

-z:有gzip屬性,即需要用 gzip 壓縮  
-j:有bz2屬性,即需要用 bzip2 壓縮  
-Z:有compress屬性的  
-v :壓縮的過程中顯示檔案(顯示所有過程)!這個常用,但不建議用在背景執行過程!  
-O:將檔案解開到標準輸出  
-f :使用檔名,請留意,在 f 之後要立即接檔名!不要再加引數!例如使用『 tar -zcvfP tfile sfile』就是錯誤的寫法,要寫成『 tar -zcvPf tfile sfile』才對喔!  
-p :使用原檔案的原來屬性(屬性不會依據使用者而變)  
-P :可以使用絕對路徑來壓縮!  
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案中!  
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!    
-f: 使用檔案名字,切記,這個引數是最後一個引數,後面只能接檔案名。  
# tar -cf all.tar *.jpg 這條命令是將所有.jpg的檔案打成一個名為all.tar的包。-c是表示產生新的包,-f指定包的檔名。  
# tar -rf all.tar *.gif 這條命令是將所有.gif的檔案增加到all.tar的包裡面去。-r是表示增加檔案的意思。   
# tar -uf all.tar logo.gif 這條命令是更新原來tar包all.tar中logo.gif檔案,-u是表示更新檔案的意思。   
# tar -tf all.tar 這條命令是列出all.tar包中所有檔案,-t是列出檔案的意思   
# tar -xf all.tar 這條命令是解出all.tar包中所有檔案,-x是解開的意思  

1、*.tar 用 tar –xvf 解壓
2、*.gz 用 gzip -d或者gunzip 解壓
3、.tar.gz和.tgz 用 tar –xzf 解壓
4、*.bz2 用 bzip2 -d或者用bunzip2 解壓
5、*.tar.bz2用tar –xjf 解壓
6、*.Z 用 uncompress 解壓
7、*.tar.Z 用tar –xZf 解壓

rev

rev命令將檔案中的每行內容以字元為單位反序輸出,即第一個字元最後輸出,最後一個字元最先輸出,依次類推

colrm

colrm命令用於刪除檔案中的指定列。colrm命令從標準輸入裝置讀取資料,轉而輸出到標準輸出裝置。如果不加任何引數,則colrm命令不會過濾任何一行。
colrm 開始列號 結束列號 < file