分类: LINUX
2012-09-23 00:09:16
文本:
12 34 56
78 90 12
23 45 89
要求对最后一个域进行排序:
awk '{a[$NF]=$0}END{l=asorti(a,b);for (i=1;i<=l;i++) print i"\t"b[i]"\t"a[b[i]]}' file
1 12 78 90 12
2 56 12 34 56
3 89 23 45 89
[解析]
首先明白按最后一个域排序,即把最后一个域做为下标,把该行的值存入数组a,本案文本是3行,执行完后得到如下内容:
a[56]=12 34 56
a[12]=78 90 12
a[89]=23 45 89
END,在最后执行命令,asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。然后必须用for循环取出数组的下标,因为数组是无法直接print打印的,这时候打印输出变量i,排序后的数字b的下标的值,然后把该下标在数组a中的赋值打印出来。
内置函数asort只对值进行排序,会丢掉原来的数组值。
awk '{a[$1]}END{print asorti(a)}' file
统计下标的数量,并打印。
-----------------------------------------------------------------
转自:http://yhj1065.blog.163.com/blog/static/1980021720116185138399/(觉得还不错)