awk排序-asort&&asorti&&管道

Awk几种排序方法

文件2.txt

000001|10

000001|20

000002|30

000002|15

000000|2

要求根据$2进行排序(FS=|

1)  使用系统资源,通过shell排序

awk -F'|' '{print $0|"sort -n -k1.8"}' 2.txt

解析:将awk的输出结果通过管道传给系统的shell命令(sort), "print$0" 可能反复执行很多次其输出的结果将先暂存于 pipe ,等到该程序结束时才会一并进行 "sort –n –k1.8".

参考:http://360537539.blog.51cto.com/3803422/711741

2)通过asotriasort内置函数来实现排序

awk -F'|' '{a[$2]=$0}END{l=asorti(a,b);for (i=1;i<=l;i++)print a[b[i]]}' 2.txt

解析:asorti(a,b)对数组a的下标进行字典排序并赋值给bba数组的下标排序后组成的数组),数组返回数组的长度,通过for循环取出数组b的值,并作为a数组的下标输出数组a的值

注意,asorti是对数组下标的字典排序(升序),类似sort默认排序

例如:文件3.txt

awk -F'|' '{a[$2]=$0;b[i]=$2;i++}END{l=asort(b);for(j=1;j<=l;j++)print a[b[j]]}' 2.txt

解析:sort(a)对数组的值进行排序,并返回数组的长度。将记录保存到数组a中,并以$2作为数组下标,用数组b来保存$2的值,并通过asort对数组b的值进行排序。然后以b的值作为a数组的下标来输出结果。

注意:asort是对数组值的数值排序(升序)。类似sort –n数值排序

 

总结:使用asortasorti缺乏灵活性,而且对于上面两个例子来说 ,如果$2有重复值的话会有相应的问题,使用管道来使用系统资源(sort)来进行排序相对更灵活。

你可能感兴趣的:(awk,sort,awk管道,asort,awk排序,asorti)