免费注册 查看新帖 |

Chinaunix

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

[文本处理] [已解决] 求 两个文件合并(指定关建列)有点复杂! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-22 15:06 |只看该作者 |倒序浏览
本帖最后由 chenteng168 于 2016-06-23 15:56 编辑

有点复杂完全搞不定--!
以下两个文件以“|”分割前两列为关建列,需要把b.txt的内容合并到a.txt里面,两个文件可能出现a.txt的关建列不在b.txt,b.txt的关建列不在a.txt中,不在的一方用0.0代替(注:a、b两个文件只是个例子,实际中两个文件中有N 列,但关键列只有两列):
a.txt
A0001|101|0.1|0.3|
A0002|102|1.1|1.2|
A0003|102|1.1|1.4|
b.txt
A0001|101|1.1|1.2|1.3|
A0002|102|1.4|1.8|1.9|
A0004|102|1.1|1.2|1.3|

最终生成以下结果
A0001|101|0.1|0.3|1.1|1.2|1.3|
A0002|102|1.1|1.2|1.4|1.8|1.9|
A0003|102|1.1|1.4|0.0|0.0|0.0|
A0004|102|0.0|0.0|1.1|1.2|1.3|

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
2 [报告]
发表于 2016-06-22 15:13 |只看该作者
昨天刚有人发过一样的。你看看昨天的帖子。。。

论坛徽章:
0
3 [报告]
发表于 2016-06-22 16:21 |只看该作者
没有大神出招吗,急用啊!

论坛徽章:
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
4 [报告]
发表于 2016-06-22 16:24 |只看该作者
都是搞哪方面的?经常要处理文本?

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
5 [报告]
发表于 2016-06-22 16:37 |只看该作者
  1. awk -F\| 'FNR==NR{b[$1FS$2FS]=1;a[$1FS$2FS]=$3FS$4FS$5FS;next}{if(b[$1FS$2FS]) {print $0a[$1FS$2FS];delete a[$1FS$2FS]} else {print $0"0.0|0.0|0.0|"}}END{for(i in a)  print i"0.0|0.0|"a[i]}' b.txt a.txt   
复制代码
回复 1# chenteng168


   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2016-06-22 16:41 |只看该作者
回复 1# chenteng168

  1. awk -F\| 'NR==FNR{a[$1"|"$2]=$3"|"$4"|"$5"|";next} {print $0(length(a[$1"|"$2])?a[$1"|"$2]:"0.0|0.0|0.0|");delete a[$1"|"$2]} END{for(i in a)print i"|0.0|0.0|"a[i]}' b.txt a.txt
  2. A0001|101|0.1|0.3|1.1|1.2|1.3|
  3. A0002|102|1.1|1.2|1.4|1.8|1.9|
  4. A0003|102|1.1|1.4|0.0|0.0|0.0|
  5. A0004|102|0.0|0.0|1.1|1.2|1.3|
复制代码

论坛徽章:
0
7 [报告]
发表于 2016-06-22 17:07 |只看该作者
本帖最后由 chenteng168 于 2016-06-22 17:10 编辑

回复 5# zxy877298415

awk -F\| 'FNR==NR{b[$1FS$2FS]=1;a[$1FS$2FS]=$3FS$4FS$5FS;next}{if(b[$1FS$2FS]) {print $0a[$1FS$2FS];delete a[$1FS$2FS]} else {print $0"0.0|0.0|0.0|"}}END{for(i in a)  print i"0.0|0.0|"a}' b.txt a.txt
    你这个应该是写死了的吧,但是我a.txt,b.txt里面不止这几列,后面还有N列怎么办啊

论坛徽章:
0
8 [报告]
发表于 2016-06-22 17:07 |只看该作者
本帖最后由 chenteng168 于 2016-06-22 17:08 编辑
Herowinter 发表于 2016-06-22 16:41
回复 1# chenteng168

awk -F\| 'NR==FNR{a[$1"|"$2]=$3"|"$4"|"$5"|";next} {print $0(length(a[$1"|"$2])?a[$1"|"$2]:"0.0|0.0|0.0|");delete a[$1"|"$2]} END{for(i in a)print i"|0.0|0.0|"a}' b.txt a.txt
你这个应该是写死了的吧,但是我a.txt,b.txt里面不止这几列,后面还有N列怎么办啊

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
9 [报告]
发表于 2016-06-22 17:39 |只看该作者
  1. awk -vFIELDWIDTHS='10 1000' 'function z(p){s="";for(j=1;j<=p/4;j++)s=s"0.0|";return s}{c[$1]}NR==FNR{a[$1]=$2;m=length($2);next}{b[$1]=$2;n=length($2)}END{for(i in c)print i (a[i]?a[i]:z(m))(b[i]?b[i]:z(n))|"sort -k1.2,1.5n"}'
复制代码

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
10 [报告]
发表于 2016-06-22 17:50 |只看该作者
  1. awk -F\| 'FNR==NR{b[$1FS$2]=1;for(i=3;i<=NF;i++) {if(!a[$1FS$2]) {a[$1FS$2]=$i} else {a[$1FS$2]=a[$1FS$2]FS$i}} next}{if(b[$1FS$2]) {print $0a[$1FS$2];delete a[$1FS$2]} else {print $0"0.0|0.0|0.0|"}}END{for(i in a)  print i"|0.0|0.0|"a[i]}' b.txt a.txt   
复制代码
回复 7# chenteng168


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP