shell腳本(三)
2、文件排序、合併和分割
(1)sort命令
#-c:測試文件是否已經排序;-k:指定排序域;-m:合併兩個已經排序的文件;
#-n:根據數字大小進行排序;-o:將輸出寫到文件;-r:將排序結果逆向顯示
#-t:改變域分隔符;-u:去除結果中的重複行
#將a.txt逆向排序,並去除重複的行
sort -u -r a.txt
#以":"爲分隔符,根據第3域數字大小來對/etc/passwd排序
sort -t: -k3n /etc/passwd
#合併已經排序的兩個文件,需要合併的兩個文件一定是已經排序了的
sort -u -m a.txt b.txt
#根據第2域來排序
sort -k2 a.txt
(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
#再如
sort 10.txt | uniq -c 10.txt
#只顯示重複的行,注意兩者區別
uniq -d 10.txt
sort 10.txt | uniq -d 10.txt
#只顯示沒有重複的行,注意文件排序前後去除重複行結果對比
#因爲第1行開始數字1連續出現3次,所以uniq -u 10.txt 不會在第1行顯示1
(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
#添加-i忽略大小寫連接效果
join -t: -i a.txt b.txt
#顯示文件1第1域、文件2第3域和文件1第2域
#-v1:不顯示文件1以共同域進行連接的結果
#-v2:不顯示文件2以共同域進行連接的結果
#-1:文件1需要連接的域;-2:文件2需要連接的域。指定域必需要先進行排序
#默認比較文件1和文件2的第1域。
#以文件1的第1域和文件2的第3域連接
join -t: -1 1 -2 3 name.txt num.txt
(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
#提取第4到第6個字符
cut -c4-6 name.txt
#提取第2到最後字符
cut -c2- name.txt
#提取第2和第6個字符
cut -c2,6 name.txt
#以":"爲分隔符,提取第1域
cut -d: -f1 num.txt
#以":"爲分隔符,提取第1域到第3域
cut -d: -f1-3 num.txt
#以":"爲分隔符,提取第2域到最後1域
cut -d: -f2- num.txt
#以":"爲分隔符,提取第1域和第4域
cut -d: -f1,4 num.txt
#提取第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
#以"-"爲分隔符,一個文件1行來將name.txt和num.txt合併
#即每一個文件行與行之間以"-"作爲連接,將所有行連接成1行
#後面的文件以同樣方式連接,然後追加到上一個文件最後面,最終一個文件1行
paste -d- -s name.txt num.txt
#合併name.txt和num.txt,並以默認分隔符作爲分隔符
paste -s name.txt num.txt
(6)split命令
#split 選項 file star_name,切割的文件名以start_name開頭,默認以x開頭
#將大文件切割成小文件,可以按照文件的行數、字節數切割文件,並能在輸出的小
#小文件中自動加上編號
#-數字n或-l數字n:以n行作爲一個文件;-b:指定多少個字節作爲一個文件;
#-C:與-b類似,但是是切割時儘量維護每行的完整性
#以2行作爲1個文件,切割文件名以startname開頭
split -2 name.txt startname