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
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