shell中文本塊的排序

寫文章前,說一下自己最近的感悟吧。最近學習到一個概念叫做"持續輸出",第一次看到"持續輸出"是在微博上一個人講如何高效閱讀,每讀完一定量的文字比如一小節或者一章內容需要寫讀書筆記,將學習到的東西轉化爲自己的沉澱和思考,如果只是流水一般看過去,可能很快就會忘記。包括最近我在公司的老司機也會跟我講需要將學習到的東西持續的輸出,寫文章,如果你還不能把一個東西講明白說明你還沒有學懂,當你能夠真正的輸出一些東西,哪怕是很小的知識點,記憶就會比你只看過深刻很多倍,當你養成持續輸出的好習慣,知識也會成系統。

這段時間在學習shell,今天在《shell腳本學習指南》當中看到對文本塊排序的方式,通常一條記錄是一行的時候我們使用sort排序即可,但是當一條記錄有多行的時候我們需要藉助於awk或者其他命令,比如如下的文本

#SORT KEY zhang san
zhang san
unter den 78
Canada

#SORT KEY qing han
qing han
xierqi haidian
China

#SORT KEY chuchu li
chuchu li
xujiaxu shanghai
China

當我們不能像sort一樣使用-k指定排序字段時,就要添加額外的標記比如以上記錄#開頭的行,那麼具體如何使用呢。首先我們的思路就是將每條記錄由多行變爲一行再進行排序,可以將每行的換行符替換爲一個特殊的不可打印字符,可以使用awk,但是awk默認每條記錄是一行,對每行進行操作,可以使用RS="",這就表示記錄以空行的方式隔開,

awk -v RS="" '{gsub("\n","^Z");print}'

gsub函數表示全局替換。此處還有一個坑,一般會在windows下將待排序文件寫好,當放在linux下時,用vim打開,使用:set ff查看文件格式爲dos,需要:set ff=unix將文件格式變爲unix下的文件,因爲unix/win/mac下的文本換行符不同,分別是\n,\r\n,\r。並且此處的不可打印字符^Z的輸入方式爲 ctrl-v ctrl-z。

通過以上方式將每條記錄變爲一行後再用sort排序,再將^Z變爲\n輸出即可,

cat myfriends|
awk -v RS="" '{gsub("\n","^Z");print}'|
sort -f|
awk -v ORS="\n\n" '{gsub("^Z","\n");print}'|
grep -v "#SORT KEY"

其中,ORS="\n\n",表示空行爲輸出記錄的分隔符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章