Board logo

标题: [其他] 【已解决】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记录数值的出现次数。

【解决方案】
  1. 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

说是说参考,其实就是照抄
  1. 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://bbs.bathome.net/) Powered by Discuz! 7.2