鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語(yǔ)句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號(hào)展開(kāi)與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開(kāi)頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語(yǔ)句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問(wèn)題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對(duì)上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號(hào) trap

shell 學(xué)習(xí)第十九天----文本塊排序

文本塊排序

文本快排序出現(xiàn)的原因: 有時(shí),你會(huì)需要將多行記錄組合而成的數(shù)據(jù)排序。 地址清單就是一個(gè)很好的例子,為了方便閱讀,地址記錄經(jīng)常會(huì)切斷,以一個(gè)或數(shù)個(gè)空行批次隔開(kāi),像這種數(shù)據(jù),沒(méi)有一定的排序鍵值位置可供 -k 選項(xiàng)使用,所以就引入了文本快排序。

案例:

我有一個(gè)文件 adress.txt,內(nèi)容為:

J Luo
Southeast University
Nanjing,China
\ 
Y Zhang
Victory University
Melbourne,Australia
\
D Hou
Beijing University
Beijing,China
\
B Liu
Shanghai Jiaotong University
Shanghai,China
\
C Lin
University of Toronto
Toronto,Canada

要求:對(duì)文本塊根據(jù)學(xué)校的名字 (每個(gè)文本塊的第二行) 進(jìn)行排序,結(jié)果仍然能以文本塊的格式輸出。

awk '{a[$2]=$0}END{for(i=1;i<=asorti(a,b);i++)print a[b[i]]}' ORS='\n\n' RS= FS='\n' adress.txt 這一種方法效率高,各種牛逼,看不明白十格什么 JB 意思。

第二種方式:awk 'BEGIN{FS="\n";RS=""}{print $1":"$2":"$3":"}' adress.txt|sort -t ":" -k2|tr ":" "\n",這種方式貌似比較平民,適合屌絲玩家。 那到底是什么意思呢?

首先使用 awk 命令將文本塊轉(zhuǎn)化成以下這樣:

J Luo:Southeast University:Nanjing,China  
Y Zhang:Victory University:Melbourne,Australia  
D Hou:Beijing University:Beijing,China  
B Liu:Shanghai Jiaotong University:Shanghai,China  
C Lin:University of Toronto:Toronto,Canada  

然后使用 sort 命令按照學(xué)校 (也就是原文本的第二行) 排序。 排序后的結(jié)果為:

D Hou:Beijing University:Beijing,China  
B Liu:Shanghai Jiaotong University:Shanghai,China  
J Luo:Southeast University:Nanjing,China  
C Lin:University of Toronto:Toronto,Canada  
Y Zhang:Victory University:Melbourne,Australia  

最后使用 tr “:” “\n” 命令,將排序后的文本轉(zhuǎn)化回來(lái)。

awkFS: 輸入字段分隔符(缺省為space),相當(dāng)于 -F 選項(xiàng)
awk -F ':' '{print}' shcool.txtawk 'BEGIN{FS=":"}{print}' shcool.txt 是一樣的

RS:輸入記錄分隔符,缺省為 "\n" 缺省情況下,awk 把一行看作一個(gè)記錄;如果設(shè)置了 RS,那么 awk 按照RS 來(lái)分割記錄,此處的意思是說(shuō)將原文本看成是一條記錄。

例如,如果文件 c,cat c 為

hello world; I want to go swimming tomorrow;hiahia

運(yùn)行 awk 'BEGIN{RS =";"} {print}' c 的結(jié)果為

hello world
I want to go swimming tomorrow
hiahia

合理的使用 RSFS 可以使得 awk 處理更多模式的文檔,例如可以一次處理多行,例如文檔 d ,cat d 的輸出為

1 2
3 4 5
\ 
6 7
8 9 10
11 12
\
hello

每個(gè)記錄使用空行分割,每個(gè)字段使用換行符分割,這樣的 awk 也很好寫(xiě)

awk 'BEGIN{FS ="\n"; RS =""} {print NF}' d 輸出

2
3
1

tr 的意思是替換,將":" 替換成"\n"。