标题: [其他] 【已解决】gawk:统计数值出现次数后,如何再进行排序 [打印本页]
作者: 思想之翼 时间: 2023-9-22 17:44 标题: 【已解决】gawk:统计数值出现次数后,如何再进行排序
本帖最后由 思想之翼 于 2023-9-22 19:25 编辑
【示例】
1.txt记录数值:
331 445 550 567
008 023 327 550 689
142 350 331 449 550 653
欲用gawk,统计1.txt记录数值的出现次数。
【解决方案】- gawk "{for(i=1;i<=NF;i++)a[$i]++}END{for(j in a)print j,a[j]}" 1.txt>2.txt
复制代码
结果2.txt记录为:
023 1
008 1
142 1
327 1
331 2
350 1
445 1
449 1
550 3
567 1
653 1
689 1
【问题】
上述2.txt ,欲根据第2列数值从多到少排序,然后在此基础上,第1列数值从小到大排序,如何用gawk解决?
排序后的2.txt记录为:
550 3
331 2
008 1
023 1
142 1
327 1
350 1
445 1
449 1
567 1
653 1
689 1
作者: Five66 时间: 2023-9-22 18:17
参考
http://www.bathome.net/thread-67319-1-4.html
4楼那个排序function
作者: 思想之翼 时间: 2023-9-22 18:49
本帖最后由 思想之翼 于 2023-9-22 18:58 编辑
回复 2# Five66
谢谢! 待处理数据不同。也曾试着套用过,细节处理不好,没成功。
作者: Five66 时间: 2023-9-22 19:09
说是说参考,其实就是照抄- gawk "function cmp_num(i1,v1,i2,v2){return (v1<v2?1:(v1>v2?-1:(i1<i2?-1:(i1>i2?1:0))))};{for(i=1;i<=NF;i++)a[$i]++}END{PROCINFO[\"sorted_in\"]=\"cmp_num\";for(j in a)print j,a[j]}" 1.txt>2.txt
复制代码
作者: Five66 时间: 2023-9-22 23:54
再说下,4楼代码统计次数是抄的1楼的gawk代码,在1楼的统计次数代码中8跟08跟008是不同的。
还有第一列的排序是按字符串数值排序的,如果数值的长度不一样,排序结果可能不是想要的
例如
023 1
1002 1
1122 1
142 1
四位数的排在了三位数上面
如果不想这样,可以在那排序function返回前将参数(i1,i2)转成2进制数值(i1=int(i1);i2=int(i2);)
总之确保所有数值长度都一样就没问题了,大概
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |