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命令排序。
这个就不用说了,鸡肋。