免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1720 | 回复: 3

[文本处理] 请教如何合并列名不完全一致的多个文本 [复制链接]

论坛徽章:
8
双鱼座
日期:2014-07-30 09:28:14辰龙
日期:2014-08-22 14:14:43水瓶座
日期:2014-12-02 15:36:392015年亚洲杯之朝鲜
日期:2015-02-06 09:28:592015亚冠之全北现代
日期:2015-09-10 14:40:18青铜圣斗士
日期:2015-11-18 09:22:56黄金圣斗士
日期:2015-11-26 09:17:2615-16赛季CBA联赛之新疆
日期:2016-08-15 17:00:22
发表于 2015-11-09 10:16 |显示全部楼层
再次请教一下各位大侠

我有一堆文本文件,格式类似但不完全一致,比如

a类文件可能有3列,分别为:


aaabbb ccc
12 3



b类文件可能有4列,分别为

aaa bbb ccc ddd
1 2 3 4
2 22 2


...

c类文件可能有2列,分别为

bbb eee
2 33
12


...

我想合并成:
file aaa bbbccc ddd eee
文件a 1 23
文件a
文件b1 2 3 4
文件b
文件c 2 33
文件c


请教可以怎么弄?
把文件名作为一列添加进去不是必须的,我刚学会怎么单独添加,我主要是不会怎么合并多个文本,并安装相应的列合并

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2015-11-09 11:36 |显示全部楼层
1.假设文件第一行标明列名
2.假设使用gawk,代码中使用了gawk的 delete array

  1. columns=$(head -qn1 fileA fileB fileC ......fileN|xargs -n1|sort -u)
  2. awk -v columns="$columns" \
  3. 'BEGIN{cn=split(columns,ca)
  4. printf "%10s","filename"
  5. for(j=1;j<=cn;j++) printf "%10s", ca[j]
  6. print ""}
  7. FNR==1{delete fil
  8. for(i=1;i<=NF;i++)for(j=1;j<=cn;j++)if($i==ca[j])fil[i]=j }
  9. {delete data;
  10. printf "%10s",FILENAME
  11. for(i=1;i<=NF;i++)data[fil[i]]=$i
  12. for(j=1;j<=cn;j++) printf "%10s", data[j]
  13. print ""}' fileA fileB fileC ......fileN
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
20032007 + 10 多谢

查看全部评分

论坛徽章:
8
双鱼座
日期:2014-07-30 09:28:14辰龙
日期:2014-08-22 14:14:43水瓶座
日期:2014-12-02 15:36:392015年亚洲杯之朝鲜
日期:2015-02-06 09:28:592015亚冠之全北现代
日期:2015-09-10 14:40:18青铜圣斗士
日期:2015-11-18 09:22:56黄金圣斗士
日期:2015-11-26 09:17:2615-16赛季CBA联赛之新疆
日期:2016-08-15 17:00:22
发表于 2015-11-09 16:47 |显示全部楼层
本帖最后由 20032007 于 2015-11-09 16:48 编辑

回复 2# waker


   非常感谢大侠出手

找猫画虎后结果不太对。

如果我固定取其中的“bbb”,“ccc”,”ddd“这几列来合并,是不是会简单一点?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-11-09 19:04 |显示全部楼层
回复 1# 20032007

$ grep . FILE[abc]
FILEa:aaa,bbb,ccc
FILEa:1,2,3
FILEb:aaa,bbb,ccc,ddd
FILEb:1,2,3,4
FILEb:2,2,2,2
FILEc:bbb,eee
FILEc:2,33
FILEc:1,2

$ awk -F, 'BEGIN{for(n=1;n<ARGC;n++){cmd="head -1 "ARGV[n];cmd|getline t;close(cmd);tt=split(t,a);for(tn=1;tn<=tt;tn++)if(!d[a[tn]]){d[a[tn]]=++c;f[c]=a[tn]}};p="file";for(n=1;n<=c;n++)p=p","f[n];print p}FNR==1{delete s;for(n=1;n<=NF;n++)s[d[$n]]=n;next}{p=FILENAME;for(n=1;n<=c;n++){N=s[d[f[n]]];p=p","(N?$N:"")}print p}' FILE[abc]
file,aaa,bbb,ccc,ddd,eee
FILEa,1,2,3,,
FILEb,1,2,3,4,
FILEb,2,2,2,2,
FILEc,,2,,,33
FILEc,,1,,,2

   

评分

参与人数 1信誉积分 +10 收起 理由
20032007 + 10 thank you

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP