標籤:shell指令碼(三)
shell指令碼(三)2、檔案排序、合并和分割(1)sort命令
#-c:測試檔案是否已經排序;-k:指定排序域;-m:合并兩個已經排序的檔案;
#-n:根據數字大小進行排序;-o:將輸出寫到檔案;-r:將排序結果逆向顯示
#-t:改變域分隔字元;-u:去除結果中的重複行
#將a.txt逆向排序,並去除重複的行
sort -u -r a.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/10/wKioL1VyvlHgv2Q5AACL5nWYlss092.jpg" />
#以":"為分隔字元,根據第3域數字大小來對/etc/passwd排序
sort -t: -k3n /etc/passwd
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/14/wKiom1VyvLKSkVryAAMRrUH0Wns003.jpg" />
#合并已經排序的兩個檔案,需要合并的兩個檔案一定是已經排序了的
sort -u -m a.txt b.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/10/wKioL1VyvlKyjEBrAACcA49_NiI117.jpg" />
#根據第2域來排序
sort -k2 a.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/10/wKioL1VyvlLjXpP6AABr_8PtRws334.jpg" />
(2)uniq命令
#去除文本中重複的行,-c:列印第行在文本中重複出現次數;-d:只顯示有重複的記錄,
#每個重複記錄只出現一次;-u:只顯示沒有重複的記錄
#需要特別注意的是所說的"重複"是指連續出現的重複!如檔案test.txt內容:
1
1
2
1
uniq -c test.txt
#結果為,第1行數字1出現次數為2,第2行數字2出現次數為1,第4第數字1出現次數為1
2 1
1 2
1 1
#再如
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/14/wKiom1VyvLLiqO81AACsq75LAwI222.jpg" />
#如果需要統計檔案中所有重複的行,則需要先對它進行排序
sort 10.txt | uniq -c 10.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/14/wKiom1VyvLOwv-gSAABiNgzk164835.jpg" />
#注意與uniq -c 10.txt的區別
#只顯示重複的行,注意兩者區別
uniq -d 10.txt
sort 10.txt | uniq -d 10.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/10/wKioL1VyvlKj3r_lAACES8IjnVA766.jpg" />
#只顯示沒有重複的行,注意檔案排序前後去除重複行結果對比
#因為第1行開始數字1連續出現3次,所以uniq -u 10.txt 不會在第1行顯示1
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/14/wKiom1VyvLOSoWM1AAC3DWT4wbA100.jpg" />
(3)join命令
#實現兩個檔案記錄的串連,需要注意的是串連的檔案要先進行排序,否則報錯!
#必需對串連域進行排序再串連,否則報錯!
#-i:比較域內容時,忽略大小寫差異;-o:設定結果顯示的格式;-t:改變域分隔字元;
#-1和-2:-1設定檔案1用於串連的域,-2設定檔案2用於串連的域
#-a1或-a2:除了顯示共同域進行串連的結果外,-a1表示還顯示檔案1中沒有共同
#域的記錄;-a2表示顯示檔案2中沒有共同域的記錄
#串連兩個檔案相同的域,域以":"為分隔字元,注意"B lily"和"B Lily"是不同的!
join -t: a.txt b.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/10/wKioL1VyvlOhKhw9AADVYZuaKw0771.jpg" />
#添加-i忽略大小寫串連效果
join -t: -i a.txt b.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/10/wKioL1VyvlThBfqnAABgRZWFRkc282.jpg" />
#顯示檔案1第1域、檔案2第3域和檔案1第2域
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/14/wKiom1VyvLWipdJ5AAElYDEQgyI701.jpg" />
#-v1:不顯示檔案1以共同域進行串連的結果
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/14/wKiom1VyvLXAs_y5AADG_qO4TtU253.jpg" />
#-v2:不顯示檔案2以共同域進行串連的結果650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/10/wKioL1VyvlXTm_GbAADopjQQlak249.jpg" />
#-1:檔案1需要串連的域;-2:檔案2需要串連的域。指定域必需要先進行排序
#預設比較檔案1和檔案2的第1域。
#以檔案1的第1域和檔案2的第3域串連
join -t: -1 1 -2 3 name.txt num.txt650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/10/wKioL1VyvlXS02HvAAEklmrL75Q410.jpg" />
(4)cut命令
#cut從標準輸入或文字檔中按域或行提取文本
#-c:指定提取的字元數或字元範圍;-f:指定提取的域數或域範圍;-d:指定域分隔字元
#cut從標準輸入或文字檔中按域或行提取文本
#-c:指定提取的字元數或字元範圍;-f:指定提取的域數或域範圍;-d:指定域分隔字元
#-cm-n:表示第m到第n個字元;-cm,n:表示第m和第n個字元;
#-cn:表示n個字元;-cn-:表示從第n個字元到最後一個字元。
#-fm-n:表示第m到第n個域;-fm,n:表示第m域和第n域;-fn:表示第n域;
#-fn-:表示從第n域到最後一個域。與-c類似。
#提取第5個字元
cut -c5 name.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/14/wKiom1VyvLagKnvbAAB55UMAhu0887.jpg" />
#提取第4到第6個字元
cut -c4-6 name.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/10/wKioL1VyvlXAl3BZAAB8qXLhDdk753.jpg" />
#提取第2到最後字元
cut -c2- name.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/14/wKiom1VyvLaTkYgGAACKJNwNhJc875.jpg" />
#提取第2和第6個字元
cut -c2,6 name.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/14/wKiom1VyvLaALsO0AACi09VUUsw723.jpg" />
#以":"為分隔字元,提取第1域
cut -d: -f1 num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/10/wKioL1VyvlbzbYGsAACYBEHxdl8652.jpg" />
#以":"為分隔字元,提取第1域到第3域
cut -d: -f1-3 num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/10/wKioL1VyvlaAJe7PAAC4IlN42hs117.jpg" />
#以":"為分隔字元,提取第2域到最後1域
cut -d: -f2- num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/14/wKiom1VyvLfA1HJ9AADGTheIalo160.jpg" />
#以":"為分隔字元,提取第1域和第4域
cut -d: -f1,4 num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/14/wKiom1VyvLfR9-L8AAC7ZTwDD28561.jpg" />
#提取第3域的第5個字元
cut -d: -f3 num.txt | cut -c5
(5)paste命令
#將文本或標準輸出中的內容粘貼到新的檔案,可將來自不同檔案的資料粘貼到一起
#-d:指定分隔字元,預設為空白格或tab;-s:將每個檔案粘貼成1行;-:從標準輸出讀取資料
#合并name.txt和num.txt,並以"-"作為分隔字元
paste -d- name.txt num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/10/wKioL1VyvlihbCFNAADuw4e36Gk284.jpg" />
#以"-"為分隔字元,一個檔案1行來將name.txt和num.txt合并
#即每一個檔案行與行之間以"-"作為串連,將所有行串連成1行
#後面的檔案以同樣方式串連,然後追加到上一個檔案最後面,最終一個檔案1行
paste -d- -s name.txt num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/10/wKioL1VyvliTVhTHAADiHO8RT1E833.jpg" />
#合并name.txt和num.txt,並以預設分隔符號作為分隔字元
paste -s name.txt num.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/14/wKiom1VyvLmzat-UAAB-vVCZvt8424.jpg" />
(6)split命令
#split 選項 file star_name,切割的檔案名稱以start_name開頭,預設以x開頭
#將大檔案切割成小檔案,可以按照檔案的行數、位元組數切割檔案,並能在輸出的小
#小檔案中自動加上編號
#-數字n或-l數字n:以n行作為一個檔案;-b:指定多少個位元組作為一個檔案;
#-C:與-b類似,但是是切割時盡量維護每行的完整性
#以2行作為1個檔案,切割檔案名稱以startname開頭
split -2 name.txt startname
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/14/wKiom1VyvLqgF0hZAAEIB2avtBA411.jpg" />
本文出自 “愛就行動” 部落格,請務必保留此出處http://1055745601.blog.51cto.com/5003160/1659235
shell指令碼(三)