找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21146|回复: 4

[其他] 【已解决】gawk:统计数值出现次数后,如何再进行排序

[复制链接]
发表于 2023-9-22 17:44:12 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 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

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-9-22 18:17:00 | 显示全部楼层
参考
http://www.bathome.net/thread-67319-1-4.html
4楼那个排序function
 楼主| 发表于 2023-9-22 18:49:15 | 显示全部楼层
本帖最后由 思想之翼 于 2023-9-22 18:58 编辑

回复 2# Five66
谢谢! 待处理数据不同。也曾试着套用过,细节处理不好,没成功。
发表于 2023-9-22 19:09:06 | 显示全部楼层
说是说参考,其实就是照抄

  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技术 +1 收起 理由
思想之翼 + 1 感谢,正确。

查看全部评分

发表于 2023-9-22 23:54:09 | 显示全部楼层
再说下,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技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 13:07 , Processed in 0.021564 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表