Linux 文本块排序

来源:互联网 发布:java equals的用法 编辑:程序博客网 时间:2024/05/16 23:35

解题思路于自与作者:Arnold Robbins & Neson H.F.Beebe

有时,我们需要多行记录进行排序,地址清单就是很好的例子。由于sort没有提供这个一方法,所以需要变通一下。

举例说明:

假如有这样的一个地址清单

# SORTKEY:Schlo,Hans JurgenHans Jurgen ScholUnter den Linden 78D-10117 BerlinGermany# SORTKEY:Jones, AdrianAdrian Jones371 Montgomery Park RoadHenley-in-Thames RG9 4AJUK# SORTKEY:Brown, KimKim Brown1841 S Main StreetWestchester, NY 10502USA# SORTKEY:Kate, LoriesLories kate235 FuZhou Park RoadFuJian provinceCHINA
针对这样的地址清单,基于国籍排序后同样以文本块输出,命令如下:

cat my-friends | awk -v RS="" '{gsub("\n", "+"); print}' | sort -f -t + -k5,5 | awk -v ORS="\n\n" '{ gsub("+", "\n"); print}'

其中第一个gsub指的是用+替换输入文本内容中的换行符号,而第二个gsub指的是将上一个gsub做的变化替换回来,需注意的是gsub("\n", "+")的第二个参数替换符必须是系统无法打印的或者是无意义的字符。
RS=""是一个特殊用法,指的是记录以空行的方式隔开,而ORS="\n\n"则是输出记录分割器,这里以换行符号作为输出分割符。

输出结果如下:

# SORTKEY:Kate, LoriesLories kate235 FuZhou Park RoadFuJian provinceCHINA# SORTKEY:Schlo,Hans JurgenHans Jurgen ScholUnter den Linden 78D-10117 BerlinGermany# SORTKEY:Jones, AdrianAdrian Jones371 Montgomery Park RoadHenley-in-Thames RG9 4AJUK# SORTKEY:Brown, KimKim Brown1841 S Main StreetWestchester, NY 10502USA


0 0
原创粉丝点击