免费注册 查看新帖 |

Chinaunix

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

问一个awk数组问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-08 22:26 |只看该作者 |倒序浏览
有如下的文件:
A G1
A G2
A G3
B G1
B G2
D G2
D G3
E G1
E G3
E G4
能通过awk数组将它转为如下的格式吗?
A G1-G2 G2-G3 G3-G1
B G1-G2
D G2-G3
E G1-G3 G3-G4 G4-G1
谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-03-08 22:39 |只看该作者
有序没有?
超过两个就循环?

论坛徽章:
0
3 [报告]
发表于 2009-03-08 22:41 |只看该作者

回复 #2 welcome008 的帖子

按第1列排序。第1列相同第2列不同的超过两个就循环,且认为类似G1-G2和G2-G1是等价的。

论坛徽章:
0
4 [报告]
发表于 2009-03-08 23:58 |只看该作者
下面的代码未经测试,但希望能对LZ有所启发




  1. awk '
  2. if($1 != filed1)
  3. {
  4.         //第1列相同第2列不同的超过两个就循环
  5.         if(count > 2)
  6.         {
  7.                 res[filed1] += " "filed2"-"star_filed2;
  8.         }
  9.        
  10.         count = 1;
  11.         filed1 = $1;
  12.         star_filed2 = filed2 = $2;
  13. }
  14. else
  15. {
  16.         count++;
  17.         //第1列相同第2列不同
  18.         if(count > 1)
  19.                 res[$1] += " "filed2"-"$2;
  20.         filed2 = $2;
  21.        
  22. }
  23. END
  24. {
  25.         for(result in res)
  26.         {
  27.                 print result, res[result]
  28.         }
  29. }' filename

复制代码

[ 本帖最后由 皇家救星 于 2009-3-9 00:00 编辑 ]

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2009-03-09 00:42 |只看该作者
有重复的没呀?~?

论坛徽章:
0
6 [报告]
发表于 2009-03-09 09:18 |只看该作者
$1相同的行都是连续出现的话
  1. [root@Mylinux tmp]# awk '{a[NR]=$1;b[NR]=$2;n[NR]=c[$1]++}END{for (i=1;i<=NR;i++) {if (n[i]==0) {printf a[i]" ";v=b[i]}if (a[i]==a[i+1]) printf " "b[i]"-"b[i+1];else {if (n[i]>1) printf " "b[i]"-"v;print ""}}}' file         
  2. A  G1-G2 G2-G3 G3-G1
  3. B  G1-G2
  4. D  G2-G3
  5. E  G1-G3 G3-G4 G4-G1
复制代码

[ 本帖最后由 ywlscpl 于 2009-3-9 09:32 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-03-09 11:08 |只看该作者
原帖由 ywlscpl 于 2009-3-9 09:18 发表
$1相同的行都是连续出现的话
[root@Mylinux tmp]# awk '{a[NR]=$1;b[NR]=$2;n[NR]=c[$1]++}END{for (i=1;i1) printf " "b"-"v;print ""}}}' file         
A  G1-G2 G2-G3 G3-G1
B  G1-G2
D  G2-G3
E  G1- ...



学习了,好好推敲!

论坛徽章:
0
8 [报告]
发表于 2009-03-09 11:10 |只看该作者

回复 #6 ywlscpl 的帖子

好像有点小问题,如果数据是:
A G1
A G2
A G3
A G4
输出结果就是:
A G1-G2 G2-G3 G3-G4 G4-G1
我想要的结果是G1-G2 G2-G3 G3-G4  G4-G1 G4-G2 G1-G3,也就是对G1-G4做C(4,2),总共6种可能.

论坛徽章:
0
9 [报告]
发表于 2009-03-09 11:13 |只看该作者

回复 #8 xyzlsh 的帖子

问题没说清楚。哎。

论坛徽章:
0
10 [报告]
发表于 2009-03-09 11:20 |只看该作者
原帖由 linuxboy823 于 2009-3-9 11:08 发表



学习了,好好推敲!


大家好,我是新手,谁能给我解释下上面的awk表达式,感激不尽,拜谢,
看了好长时间,看不懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP