[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【已解决】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
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

参考
http://www.bathome.net/thread-67319-1-4.html
4楼那个排序function

TOP

本帖最后由 思想之翼 于 2023-9-22 18:58 编辑

回复 2# Five66
谢谢! 待处理数据不同。也曾试着套用过,细节处理不好,没成功。

TOP

说是说参考,其实就是照抄
  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
复制代码
1

评分人数

TOP

再说下,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);)

总之确保所有数值长度都一样就没问题了,大概
1

评分人数

TOP

返回列表