- echo "8 11111 9" | awk '{for(i=1;i<=NF;i++)a[$i]=$i;for(j=1;j<=asorti(a,b);j++)printf a[b[j]] FS;printf RS;delete a}'
- 11111 8 9
- echo "8 11111 9" | awk '{for(i=1;i<=NF;i++)a[$i]=$i;for(j=1;j<=asort(a);j++)printf a[j] FS;printf RS;delete a}'
- 8 9 11111
[解析]
都是awk的内置排序函数(升序排列),结果是有区别的,是什么因素造成它们的差别呢?首先来看 asorti ,它是根据字符串来排序的,8的内码是0x38,而1是0x31,字符串比较肯定是先比较第一个字符,那么11111就排在了8之前,尽管数值上11111比8大许多。而 asort 则是按照数值的大小来排列的。
我们再看它们之间的第二个区别:
- $ cat file
- aaa 125
- ddd 123
- bbb 128
- ccc 120
- $ awk '{a[$2]=$0}END{for(i=1;i<=asort(a);i++)print a[i]}' file
- aaa 125
- bbb 128
- ccc 120
- ddd 123
- $ awk '{a[$2]=$0}END{for(i=1;i<=asorti(a,b);i++)print a[b[i]]}' file
- ccc 120
- ddd 123
- aaa 125
- bbb 128
[解析]
同样都是对第2列的数字进行排序为什么结果完全不一样?原来asort是对数组的值进行排序,而asorti是对数组的下标进行排序。
阅读(7782) | 评论(3) | 转发(2) |