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".
参考:
2)通过asotri和asort内置函数来实现排序
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的下标进行字典排序并赋值给b(b为a数组的下标排序后组成的数组),数组返回数组的长度,通过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数值排序
总结:使用asort和asorti缺乏灵活性,而且对于上面两个例子来说 ,如果$2有重复值的话会有相应的问题,使用管道来使用系统资源(sort)来进行排序相对更灵活。