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

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

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

案例:
我有一個文件 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
要求:對文本塊根據(jù)學(xué)校的名字(每個文本塊的第二行)進(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)化回來.
awk 的 FS:輸入字段分隔符(缺省為:space:),相當(dāng)于-F 選項(xiàng)
awk -F ':' '{print}' shcool.txt 和 awk 'BEGIN{FS=":"}{print}' shcool.txt 是一樣的

RS:輸入記錄分隔符,缺省為"\n"缺省情況下,awk 把一行看作一個記錄;如果設(shè)置了 RS,那么 awk 按照 RS 來分割記錄,此處的意思是說將原文本看成是一條記錄.
例如,如果文件 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
合理的使用 RS 和 FS 可以使得 awk 處理更多模式的文檔,例如可以一次處理多行,例如文檔 d ,cat d 的輸出為
1 2
3 4 5

6 7
8 9 10
11 12

hello
每個記錄使用空行分割,每個字段使用換行符分割,這樣的
awk 也很好寫
awk 'BEGIN{ FS = "\n"; RS = ""} {print NF}' d 輸出
2
3
1

而 tr 的意思是替換,將”:”替換成”\n”.