免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1863 | 回复: 9
打印 上一主题 下一主题

[数值计算] 看似简单又不易解决的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-23 11:59 |只看该作者 |倒序浏览
看似简单又很难解决的一个问题

现有文本格式如下,数据是学生多次考试的成绩,第一列为姓名,第二列为分数。
如何用awk等工具,统计出考过相同分数的同学,按考过分数相同的频次,由高到低排序。

姓名 成绩
张三 85
李四 85
王五 85
赵六 60
.
.
.
张三 95
李四 90
王五 90
赵六 70
.
.
.
张三 65
李四 60
王五 60
赵六 70
.
.
.

如果按上面数据为例,统计结果如下三列:

频次 姓名 相同分数同学              频次解释(该列不需要)

4    李四  王五                  (“李四 85 , 王五 85 ”;“李四 85 ,张三 85 ”;“李四 90 ,王五 90 ” ;“李四 60,王五 60”)
2    王五  李四                  (“王五 85, 李四 85”;“王五 90, 李四 90”;“王五 60, 李四 60”)
1    张三  李四                  (“张三 85 , 李四 85 ”)
1    李四  张三                  (“李四 85 , 张三 85 ”)
1    李四  王五                  (“李四 85 , 王五 85 ”)

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
2 [报告]
发表于 2013-06-23 13:19 |只看该作者
好费解!

4    李四  王五                  (“李四 85 , 王五 85 ”;“李四 85 ,张三 85 ”;“李四 90 ,王五 90 ” ;“李四 60,王五 60”)


这行的意思是不是: 李四是和别人有四次分数相同的,和 和王五三次(分别都是 85,90,60) 和 张三有一次相同(都是85),三次加一次是4次,所以第一列要输出4,
但为什么名字只有李四和王五,张三为什么不写上去? 唯一的解释,王五和李四有3次相同,张三只有一次,取最多的一个人,但这又引出一个问题:如果张三也有三次分数和李四相同,怎么写

2    王五  李四                  (“王五 85, 李四 85”;“王五 90, 李四 90”;“王五 60, 李四 60”)


如果我蓝色那行字的分析是对的,这一行的开头为什么是2? 为什么不是三,有三个分数和别人(且同一人)相同85,90,60.


论坛徽章:
0
3 [报告]
发表于 2013-06-23 13:56 |只看该作者
二楼说的对,第二行的数字应该是3
不好意思,敲错了,非常感谢纠正!

如果按上面数据为例,统计结果如下三列:

频次 姓名 相同分数同学              频次解释(该列不需要)

4    李四  王五                  (“李四 85 , 王五 85 ”;“李四 85 ,张三 85 ”;“李四 90 ,王五 90 ” ;“李四 60,王五 60”)
3    王五  李四                  (“王五 85, 李四 85”;“王五 90, 李四 90”;“王五 60, 李四 60”)
1    张三  李四                  (“张三 85 , 李四 85 ”)
1    李四  张三                  (“李四 85 , 张三 85 ”)
1    李四  王五                  (“李四 85 , 王五 85 ”)

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
4 [报告]
发表于 2013-06-23 16:02 |只看该作者
@密码很长
1    李四  王五                  (“李四 85 , 王五 85 ”)


这一行又有什么玄机?
既然李四和王五有三个分数相同.           "4    李四  王五                  (“李四 85 , 王五 85 ”;“李四 85 ,张三 85 ”;“李四 90 ,王五 90 ” ;“李四 60,王五 60”)"  

没办法理解!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2013-06-23 18:13 |只看该作者
  1. awk '{a[$1]=a[$1]" "$2;b[$2]=b[$2]" "$1}END{for(i in a){for(j=1;j<=split(a[i],c," ");j++){for(k=1;k<=split(b[c[j]],d," ");k++){if(i!=d[k])e[i" "d[k]]++}}};for(i in e)print e[i],i|"sort -nr"}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2013-06-23 19:49 |只看该作者
回复 5# yinyuemi


非常感谢!我描述的问题不够准确,但大侠理解的完全正确!高手!有些看不明白,能解释一下就好了。

根据大侠的脚本,执行结果如下:
3 王五 李四
3 李四 王五
1 赵六 王五
1 赵六 李四
1 王五 赵六
1 王五 张三
1 李四 赵六
1 李四 张三
1 张三 王五
1 张三 李四


   

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
7 [报告]
发表于 2013-06-23 21:54 |只看该作者
  1. awk '{b[$2]=b[$2]" "$1}END{for(i in b)print b[i]}' file | awk '{for(i=1;i<=NF;i++)for(j=i+1;j<=NF;j++)a[$i" "$j]++}END{for (i in a)print a[i],i}'
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
8 [报告]
发表于 2013-06-23 22:41 |只看该作者
  1. awk '{split(b[$2],c," ");for(i in c){if(c[i]==$1)break;a[c[i]" "$1]++};b[$2]=b[$2]" "$1}END{for(i in a)print a[i],i}' file
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
9 [报告]
发表于 2013-06-24 15:17 |只看该作者
本帖最后由 cao627 于 2013-06-24 15:38 编辑
  1. $cat file
  2. 张三 85
  3. 李四 85
  4. 李四 90
  5. 张三 90

  6. $awk '{split(b[$2],c," ");for(i in c){if(c[i]==$1)break;a[c[i]" "$1]++};b[$2]=b[$2]" "$1}END{for(i in a)print a[i],i}' file
  7. 1 李四 张三
  8. 1 张三 李四

  9. $awk '{split(b[$2],c," ");for(i in c){if(c[i]==$1)break;a[c[i]" "$1]++;a[$1" "c[i]]++};b[$2]=b[$2]" "$1}END{for(i in a)print a[i],i}' file
  10. 2 李四 张三
  11. 2 张三 李四

复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
10 [报告]
发表于 2013-06-24 16:07 |只看该作者
  1. $cat file
  2. 李四 85
  3. 张三 85
  4. 李四 90
  5. 张三 90
  6. 李四 85  #李四有两门85,算有三门分数和张三相同?

  7. $awk '{split(b[$2],c," ");for(i in c){if(c[i]==$1)break;a[c[i]" "$1]++;a[$1" "c[i]]++};b[$2]=b[$2]" "$1}END{for(i in a)print a[i],i}' file
  8. 2 李四 张三
  9. 2 张三 李四

  10. $awk '{split(b[$2],c," ");for(i in c){if(c[i]==$1)continue;a[c[i]" "$1]++;a[$1" "c[i]]++};b[$2]=b[$2]" "$1}END{for(i in a)print a[i],i}' file
  11. 3 李四 张三
  12. 3 张三 李四

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP