免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 列相同合并行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-10 14:29 |只看该作者 |倒序浏览
如果第一列到第四列都相同,就合并行
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;448
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;1
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;448
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;2
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0
需要的结果
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;448;0;0;0;0;0;0;1
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;448;0;0;0;0;0;2;0
参照曾经的一个帖子,依葫芦画瓢如下(但是不成功),请各位指教
awk '{a[$1";"$2";"$3";"$4]=a[$1";"$2";"$3";"$4](a[$1";"$2";"$3";"$4]?";":"")$5}END{for (j in a) print j,a[j]}'
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-2;1;;
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-1;2;;
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-2;0;;
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-2;448;;
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-1;0;;
ECR01;2012-5-10;2012-5-10;00:00:00;ISL-1;448;;

论坛徽章:
0
2 [报告]
发表于 2012-08-10 14:33 |只看该作者
awk  'BEGIN{OFS=FS=";"}{split(a[$1";"$2";"$3";"$4],temp);$5=temp[5]";"$5;a[$1";"$2";"$3";"$4]=$0}END{for(n in a)print a[n]}'
这个尝试了也不行
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;;1

论坛徽章:
0
3 [报告]
发表于 2012-08-10 14:46 |只看该作者
本帖最后由 personball 于 2012-08-10 14:49 编辑

回复 1# conall


    awk -F; '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;}END{for( i in a)print a[ i ]}'

大致思路,代码未测试
PS:最近[ i ]标签很活跃,囧,总是斜体

论坛徽章:
0
4 [报告]
发表于 2012-08-10 14:54 |只看该作者
本帖最后由 conall 于 2012-08-10 15:01 编辑

谢谢,但是不是我想要的结果
$ awk -F";" '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;}END{for( i in a)print a[ i ]}' 1.txt
;448;0;0;0;0;0;2;0
;448;0;0;0;0;0;0;1
修正了一下,
$ awk -F";" '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;b=$0;}END{for( i in a)print b,a[ i ]}' 1.txt
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0 ;448;0;0;0;0;0;2;0
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;0 ;448;0;0;0;0;0;0;1
还是不行,结果应该是
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-2;448;0;0;0;0;0;0;1
ECR01;2012-5-10;2012-5-10 00:00:00;ISL-1;448;0;0;0;0;0;2;0
再请赐教

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
5 [报告]
发表于 2012-08-10 14:59 |只看该作者
  1. awk -F";" '{a=$1";"$2";"$3";"$4; out[a]=out[a]";"$NF}END{for (i in out)print i out[i]}'
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-08-10 15:07 |只看该作者
本帖最后由 conall 于 2012-08-10 15:10 编辑

谢谢,
awk -F";" '{a=$1";"$2";"$3";"$4; out[a]=out[a]";"$NF}END{for (i in out)print i out}'
是可以的,但是对比“personball ”的
awk -F";" '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;}END{for( i in a)print a[ i ]}'
稍微修正一下
awk -F";" '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;}END{for( i in a)print i a[ i ]}'也是可行的
1.这里,
awk -F";" '{t=$1";"$2";"$3";"$4;a[t]=a[t]";"$NF;}END{for( i in a)print i a[ i ]}'
awk -F";" '{a=$1";"$2";"$3";"$4; out[a]=out[a]";"$NF}END{for (i in out)print i out}'
都可以执行成功,但是";"$NF;}END与";"$NF}END有什么区别?
2.print i a[ i ]其中i是等同于$0吗?

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
7 [报告]
发表于 2012-08-10 15:13 |只看该作者
";"$NF;}END与";"$NF}END
没区别

print i a[ i ] i 是数组a的索引值,可以把a看作关联数组.

论坛徽章:
0
8 [报告]
发表于 2012-08-10 15:49 |只看该作者
本帖最后由 personball 于 2012-08-10 15:53 编辑

回复 4# conall


    哈,不好意思,因为自己没测试过,漏了输出前面部分了  print i a[ i ] 才对。。。
稍微解释一下,awk中 a[t] 就是以t的值(前4列)做下标的数组变量,该变量本身对最后一列进行字符串累加,最后遍历数组,输出下标i 即前4列,和值a[ i ] 即可

论坛徽章:
0
9 [报告]
发表于 2012-08-10 15:53 |只看该作者
谢谢前辈解答!

论坛徽章:
1
天蝎座
日期:2013-08-22 15:14:44
10 [报告]
发表于 2012-08-10 22:24 |只看该作者
本帖最后由 guogang225 于 2012-08-10 22:26 编辑

awk -F";" '{t=$1FS$2FS$3FS$4;a[t]=a[t]FS$5}END{for(i in a) print i a}' awk.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP