免费注册 查看新帖 |

Chinaunix

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

怎么实现另一类文件和并 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-04 11:39 |只看该作者 |倒序浏览
三个文件,file1分别与file2、file3有一对多的关系,关联点是第一列,现在需要将这三个文件合并:
file 1:
m  m1 m2 m3
n  n1 n2

file 2:
m  AA1
n  BB1
n  BB2
n  BB3
p  PP1

file 3:
m  CC1
m  CC2
n  DD1
n  DD2
q  QQ1

合成后效果:
m  m1 m2 m3 : AA1 | CC1,CC2 ;
n  n1 n2  : BB1,BB2,BB3 | DD1,DD2 ;


主要是对于下面这三点的解决办法没想明白
1、file2、file3中可能包括file1中没有的记录行
2、file2、file3中第一列重复的记录可能有任意行数
3、要把file2 file3中所有与file1对应的值都追加到file1对应的行尾,放在一行里

需要使用二维数组吗?还是需要与shell组合使用?
搜索了网上的示例,试图套写个awk语句,但发现例子都是拼成多行,类似join命令的效果,而不是写到一行里

请各位指点迷津,谢谢

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
2 [报告]
发表于 2008-09-04 11:49 |只看该作者

回复 #1 ppp_qqq 的帖子

awk

论坛徽章:
0
3 [报告]
发表于 2008-09-04 12:11 |只看该作者
笨办法
试试
awk '
FILENAME=="file1"{a[$1]=$0 ":";next}
FILENAME=="file2"{ if($1 in a) a[$1]=a[$1] $2 ",";next}
FNR==1{for(n in a){sub(/,$/,"",a[n]);sub(/$/,"|",a[n];}}
{if($1 in a) a[$1]=a[$1] $2 ",";}
END{
     for(n in a){sub(/,$/,"",a[n];}print a[n] ";"}
    }
' file1 file2 file3

[ 本帖最后由 爱知 于 2008-9-4 12:13 编辑 ]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 2008-09-04 12:41 |只看该作者
  1. awk 'FILENAME==ARGV[ARGC-1]{j=1;printf $0" : ";while(j<i){printf a[j,$1]" | ";j++}print a[i,$1]" ;";next}FNR==1{i++}{a[i,$1]=a[i,$1]?a[i,$1]","$2:$2}' file2 file3 file1
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-09-04 16:47 |只看该作者
awk 'NR==FNR{t[$1]=$0":"}NR>FNR&&($1 in t){t[$1]=t[$1]"|"$2 }END{for(i in t)print i,t}' file1 file2 file3

[ 本帖最后由 snake_blue 于 2008-9-4 16:49 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-09-04 17:08 |只看该作者
4楼的是对的,我的有问题。4楼的哥们能否给解释一下{a[i,$1]=a[i,$1]?a[i,$1]","$22} 这个,是用三元操作符给a[i,$1]赋值吗?如果是的话a[i,$1]?这个应该怎么理解呢?想了很久没明白,希望给与解答

[ 本帖最后由 snake_blue 于 2008-9-5 14:51 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-09-05 15:19 |只看该作者
自己顶一下,希望有高手给解答下

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
8 [报告]
发表于 2008-09-05 15:24 |只看该作者

回复 #6 snake_blue 的帖子

a[i,$1]=a[i,$1]?a[i,$1]","$22
条件表达式。
二维数组。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2008-09-05 15:36 |只看该作者
原帖由 snake_blue 于 2008-9-4 17:08 发表
4楼的是对的,我的有问题。4楼的哥们能否给解释一下{a=a?a","$22} 这个,是用三元操作符给a赋值吗?如果是的话a?这个应该怎么理解呢?想了很久没明白,希望给与解答


{a[i,$1]=a[i,$1]?a[i,$1]","$22}

<==>

if ( a[i,$1] ) a[i,$1] = a[i,$1] "," $2 ;else a[i,$1] = $2

论坛徽章:
0
10 [报告]
发表于 2008-09-05 15:43 |只看该作者
谢谢楼上的解答,我理解的也是这个意思。就是if(a[i,$1])犯糊涂,a[i,$1]这个元素是个布尔变量?还是说他存在不为空就是真,为空就是假?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP