免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 统计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-05 16:47 |只看该作者 |倒序浏览
本帖最后由 z421941982 于 2013-01-06 21:40 编辑

现有文件内容如下:
  1. a        111
  2. b        111
  3. c        111
  4. d        111
  5. b        222
  6. c        222
  7. d        222
复制代码
文件中第一列为文本(名称), 第二列为数值(金额), 现想得到以下结果:
  1. a b 1
  2. a c 1
  3. a d 1
  4. b a 1
  5. b c 2
  6. b d 2
  7. c a 1
  8. c b 2
  9. c d 2
  10. d a 1
  11. d b 2
  12. d c 2
复制代码
统计规则如下:
a c 1  意思为:  第一列的名称中 a 与 c 在第二列的金额 相等的 记录有 1个. ( 注 根据文件中 第1行记录和第3行记录 得到的结果)
b c 2  意思为:  第一列的名称中 b 与 c 在第二列的金额 相等的 记录有 2个. ( 注 根据文件中 第2,3行记录和第5,6行记录 得到的结果)


论坛徽章:
0
2 [报告]
发表于 2013-01-05 17:31 |只看该作者
没看明白是下面这个意思不?
先把文件复制一下 cp f1 f2
  1. awk 'NR==FNR{a[$1" "$2]=$0;next}
  2. {
  3.    for(i in a)
  4.       {
  5. print a[i],"   "$0
  6.        }
  7.   }' f1 f2  |
  8. awk '
  9. {
  10.   if($2==$4)
  11.     {print $1,$3,"1"}
  12.    else
  13.    {print $1,$3," 2" }
  14. }'  
  15. d  a  1
  16. c  a  1
  17. d  a  2
  18. b  a  1
  19. c  a  2
  20. a  a  1
  21. b  a  2
  22. d  b  1
  23. c  b  1
  24. d  b  2
  25. b  b  1
  26. c  b  2
  27. a  b  1
  28. b  b  2
  29. d  c  1
  30. c  c  1
  31. d  c  2
  32. b  c  1
  33. c  c  2
  34. a  c  1
  35. b  c  2
  36. d  d  1
  37. c  d  1
  38. d  d  2
  39. b  d  1
  40. c  d  2
  41. a  d  1
  42. b  d  2
  43. d  b  2
  44. c  b  2
  45. d  b  1
  46. b  b  2
  47. c  b  1
  48. a  b  2
  49. b  b  1
  50. d  c  2
  51. c  c  2
  52. d  c  1
  53. b  c  2
  54. c  c  1
  55. a  c  2
  56. b  c  1
  57. d  d  2
  58. c  d  2
  59. d  d  1
  60. b  d  2
  61. c  d  1
  62. a  d  2
  63. b  d  1
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-01-06 16:11 |只看该作者
回复 2# dahaoshanhe


你写这个我也没看懂, 干嘛把文件拷成两份?

   

论坛徽章:
2
水瓶座
日期:2014-08-20 14:38:50辰龙
日期:2014-09-15 15:49:06
4 [报告]
发表于 2013-01-06 17:27 |只看该作者
呵呵  没看懂正常

论坛徽章:
1
射手座
日期:2014-03-10 14:24:52
5 [报告]
发表于 2013-01-06 17:46 |只看该作者
感觉很难的样子,要用二维数组和俩循环判断才能输出来楼主想要的。

论坛徽章:
1
射手座
日期:2014-03-10 14:24:52
6 [报告]
发表于 2013-01-06 18:44 |只看该作者
本帖最后由 davidbeckham921 于 2013-01-07 10:44 编辑
  1. awk '{a[$1]++;b[$1,a[$1]-1]=$2;a[$1]>m?m=a[$1]:m=m}0END{for(i in a) for (j in a) for(k=0;k<=m;k++)if( i!=j && b[i,k]==b[j,k] && b[i,k]!="") printf "%s\t%s\t%s\n",i,j,b[j,k]}' urfile\
  2. |awk '{a[$1" "$2]++}END{for(i in a)print i" "a[i]}'
复制代码
写完已经大小便失禁,生活不能自理了,求高手简化。

如果没有理解错你的意思的话结果应该是,跟你期望的结果稍有偏差,感觉你给的答案是不对的。比如:b d 都有111和222,所以应该是 b d 2
a b 1
a c 1
a d 1
b a 1
b c 2
b d 2
c a 1
c b 2
c d 2
d a 1
d b 2
d c 2

求高手解释,能否把管道后的awk合并到前面?!俩END怎么搞?!

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2013-01-06 19:47 |只看该作者
我也来写一个吧
  1. awk '{a[$1];b[$2];c[$1""$2]}END{for(i in a){for(j in a){if(i!=j){for(k in b){if((i""k in c)&&(j""k in c))n++}print i,j,n;n=""}}}}'
复制代码
运行结果如下:
  1. [root@localhost ~]# cat i
  2. a        111
  3. b        111
  4. c        111
  5. d        111
  6. b        222
  7. c        222
  8. d        222
  9. [root@localhost ~]# awk '{a[$1];b[$2];c[$1""$2]}END{for(i in a){for(j in a){if(i!=j){for(k in b){if((i""k in c)&&(j""k in c))n++}print i,j,n;n=""}}}}' i
  10. a b 1
  11. a c 1
  12. a d 1
  13. b a 1
  14. b c 2
  15. b d 2
  16. c a 1
  17. c b 2
  18. c d 2
  19. d a 1
  20. d b 2
  21. d c 2
  22. [root@localhost ~]#
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-01-06 21:39 |只看该作者
回复 6# davidbeckham921
  你的答案是正确的, 要的就是这个结果



   

论坛徽章:
0
9 [报告]
发表于 2013-01-06 21:47 |只看该作者
回复 7# yestreenstars


    神一样的代码, 看一遍都晕了, 就是要这个结果!!!

论坛徽章:
0
10 [报告]
发表于 2013-01-07 09:39 |只看该作者
回复 8# z421941982


    你的问题写的还没有人家给出正确答案的人写的代码好懂  神呀你
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP