解题思路于自与作者:Arnold Robbins & Neson H.F.Beebe
有时,我们需要多行记录进行排序,地址清单就是很好的例子。由于sort没有提供这个一方法,所以需要变通一下。
举例说明:
假如有这样的一个地址清单
# SORTKEY:Schlo,Hans Jurgen
Hans Jurgen Schol
Unter den Linden 78
D-10117 Berlin
Germany
# SORTKEY:Jones, Adrian
Adrian Jones
371 Montgomery Park Road
Henley-in-Thames RG9 4AJ
UK
# SORTKEY:Brown, Kim
Kim Brown
1841 S Main Street
Westchester, NY 10502
USA
# SORTKEY:Kate, Lories
Lories kate
235 FuZhou Park Road
FuJian province
CHINA
针对这样的地址清单,基于国籍排序后同样以文本块输出,命令如下:
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, Lories
Lories kate
235 FuZhou Park Road
FuJian province
CHINA
# SORTKEY:Schlo,Hans Jurgen
Hans Jurgen Schol
Unter den Linden 78
D-10117 Berlin
Germany
# SORTKEY:Jones, Adrian
Adrian Jones
371 Montgomery Park Road
Henley-in-Thames RG9 4AJ
UK
# SORTKEY:Brown, Kim
Kim Brown
1841 S Main Street
Westchester, NY 10502
USA