awk的sort命令学习一例

在看awk的过程中闲来网上找些题做做。

 #cat  1

12 34 56
23 45 89
78 90 12
 
然后要求对最后一个域进行排序后输出:
78 90 12
12 34 56
23 45 89
 
A,方法1
从上面来看需要对数字进行排序,要么自己写算法,要么使用现成的函数。linux下面提供的有sort排序。
首先来看sort如何实现的。
#cat 1 | sort -k3 -n
78 90 12
12 34 56
23 45 89
#cat 1 | sort -k3 -rn
23 45 89
12 34 56
78 90 12
从上面可以看出sort的功能对铁定的域进行排序
拓展sort用法
sort用于排序
-t sep              定义分割符号,默认位空格/tab
-k  sum            定义第一个域
-n                    数字排序,生序
-rn                  数字排序,降序
-r                    反转结果 ,结果位生序反转就为降序
 
B,方法2
采用awk内建的排序函数asort,asorti进行。
#cat 1 | awk '{a[$NF]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print a[b[i]]}
 
思路,用每一行的第三列作为数组下标,整行作为值,然后对下标进行排序,后输出数组的值。
伪代码如下:
a[56]="12 34 56" 
a[12]="78 90 12"
a[89]="23 45 89"
然后对下标排序。
a[12]="78 90 12"
a[56]="12 34 56" 
a[89]="23 45 89"
然后输出就OK了
 
说明。
1,NF为域的个数
#cat 1 | awk '{print NF,$NF}'
3 56
3 12
3 89
从上面可以看出上面默认分为了3个域,所以NF=3,$NF=$3,awk是行读入,所以$3即为输出每一行的第三个域的值。
2,asort,asorti的用法
asort用法:
 populate the array data
     n = asort(data)
     for (i = 1; i <= n; i++) do something with data[i]
是对数组中的值进行排序的,默认结果data[1]<=data[2]<=....data[n]
注意,使用上面的方法,数组的下标回默认从1,开始到N结束,原有的下标会被擦除。
建议采用下面的方法。
  populate the array source
     n = asort(source, dest)
     for (i = 1; i <= n; i++) do something with dest[i]
可以将排序后的结果生成一个新的数组dest。然后将dest结果输出。
asorti的用法。和asort方法一样。不同的是,asorti是对数组的下标进行排序。
{ sortce[$0]=some_func[$0]}
END{
    n=asorti(source,dest)
      for(i=1;i<=n;i++){
         work with sorted indices directly:
         do something with dest[i]
            ...
          access original array via sorted indices:
           do something with source[dest[i]]
   }
 }
3,可以在awk中调用system中sort命令排序。
这个就不用说了,鸡肋。