shell学习十九天----文本块排序

文本块排序

文本快排序出现的原因:有时,你会需要将多行记录组合而成的数据排序.地址清单就是一个很好的例子,为了方便阅读,地址记录经常会切断,以一个或数个空行批次隔开,像这种数据,没有一定的排序键值位置可供-k选项使用,所以就引入了文本快排序.

案例:

我有一个文件 adress.txt,内容为:

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
要求:对文本块根据学校的名字(每个文本块的第二行)进行排序,结果仍然能以文本块的格式输出。

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命令将文本块转化成以下这样:

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命令按照学校(也就是原文本的第二行)排序.排序后的结果为:

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”命令,将排序后的文本转化回来.

awk FS:输入字段分隔符(缺省为:space:),相当于-F选项
awk -F ':' '{print}' shcool.txt       awk 'BEGIN{FS=":"}{print}' shcool.txt 是一样的

 

RS:输入记录分隔符,缺省为"\n"缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录,此处的意思是说将原文本看成是一条记录.

例如,如果文件ccat c

hello world; I want to go swimming tomorrow;hiahia

运行 awk 'BEGIN{ RS = ";" } {print}' c 的结果为

hello world

I want to go swimming tomorrow

hiahia
合理的使用RSFS可以使得awk处理更多模式的文档,例如可以一次处理多行,例如文档,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”.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值