免费注册 查看新帖 |

Chinaunix

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

[文本处理] 【已解决】文本合并 帮忙改下awk命令 [复制链接]

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

帮忙修改一下AWK命令
1、以前的文件及awk命令{
以下两个文件以“|”分割前两列为关建列,需要把b.txt的内容合并到a.txt里面,两个文件可能出现a.txt的关建列不在b.txt,b.txt的关建列不在a.txt中,不在的一方用0.0代替(注:a、b两个文件只是个例子,实际中两个文件中有N 列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|

awk -F\| 'NR==FNR{s1=$3;for(i=4;i<=NF;i++)if(length($i))s1=s1""FS$i;a[$1FS$2]=s1;if(FNR==1){d1="0.0";for(i=4;i<=NF;i++)if(length($i))d1=d1""FS"0.0"};next} {print $0(length(a[$1FS$2])?a[$1FS$2]:d1)FS;delete a[$1FS$2];if(FNR==1){d2="0.0";for(i=4;i<=NF;i++)if(length($i))d2=d2""FS"0.0"}} END{for(i in a)print i""FS""d2""FS""a""FS}' b.txt a.txt
最终生成以下结果
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、现在要的要求{
以下两个文件以“|”分割前两列为关建列,需要把b.txt的内容合并到a.txt里面,两个文件可能出现a.txt的关建列不在b.txt,b.txt的关建列不在a.txt中,不在的一方用0.0代替(注:a、b两个文件只是个例子,实际中两个文件中有N 列N 行,但关键列只有第一列
a.txt
A0001|0.1|0.3|
A0002|1.1|1.2|
A0003|1.1|1.4|
b.txt
A0001|1.1|1.2|1.3|
A0002|1.4|1.8|1.9|
A0004|1.1|1.2|1.3|
最终生成以下结果
A0001|0.1|0.3|1.1|1.2|1.3|
A0002|1.1|1.2|1.4|1.8|1.9|
A0003|1.1|1.4|0.0|0.0|0.0|
A0004|0.0|0.0|1.1|1.2|1.3|
不知道怎么改上面的awk命令--!

论坛徽章:
5
金牛座
日期:2015-07-03 13:32:00卯兔
日期:2015-07-03 13:32:17程序设计版块每日发帖之星
日期:2015-11-29 06:20:0015-16赛季CBA联赛之同曦
日期:2015-12-15 09:36:06CU十四周年纪念徽章
日期:2016-07-06 17:18:48
2 [报告]
发表于 2016-06-27 15:45 |只看该作者
  1. awk -F \| 'NR==FNR{a[$1]=$2 FS $3 FS $4 FS;next}{print $0(length(a[$1])?a[$1]:"0.0|0.0|0.0|");delete a[$1]} END{for(i in a)print i"|0.0|0.0|"a[i]}' b.txt a.txt
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-06-27 16:15 |只看该作者
回复 2# seanking1987


    你这个是写死了的,实际中有N列N行,达不到目的

论坛徽章:
780
金牛座
日期: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
4 [报告]
发表于 2016-06-27 16:28 |只看该作者
回复 1# chenteng168

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

论坛徽章:
0
5 [报告]
发表于 2016-06-27 16:53 |只看该作者
回复 4# Herowinter


    谢谢,非常感谢!

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
6 [报告]
发表于 2016-06-27 17:48 |只看该作者
  1. #!/usr/bin/python
  2. #coding:utf8

  3. import fileinput

  4. files = ['a.txt', 'b.txt']
  5. handle_result = {}
  6. order_keys = []
  7. from_before = []
  8. from_after = []
  9. for line in fileinput.input(files):
  10.     line_eles = line.strip().strip('|').split('|')
  11.     k = line_eles[0]
  12.     handle_result.setdefault(k, []).extend(line_eles[1:])
  13.     if k not in order_keys:
  14.         order_keys.append(k)
  15.     if fileinput.filename() == files[0]:
  16.         from_before.append(k)
  17.     else:
  18.         from_after.append(k)


  19. max_column = 0
  20. for k in order_keys:
  21.     if max_column < len(handle_result[k]):
  22.         max_column = len(handle_result[k])

  23. for k in order_keys:
  24.     if k in from_before:
  25.         while len(handle_result[k]) < max_column:
  26.             handle_result[k].append('0.0')
  27.     elif k in from_after:
  28.         while len(handle_result[k]) < max_column:
  29.             handle_result[k].insert(0,'0.0')

  30. for k in order_keys:
  31.     print "%s|%s|"  % (k,'|'.join(handle_result[k]))
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
Herowinter + 10 很给力!

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2016-06-28 10:28 |只看该作者
回复 4# Herowinter


    你很厉害,我看了很多贴子都是你解决的,无法用语言来表达对你的崇拜!
还想问你个问题,通过第一列关键列,把后面的每一列求和,实际中还是有N列N行
42012319891122492X|10000|100|10000|
420123197911215144|10000|30000|200|
420123197911215144|10000|30000|200|

论坛徽章:
780
金牛座
日期: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
8 [报告]
发表于 2016-06-28 10:54 |只看该作者
回复 7# chenteng168

  1. awk -F\| '{a[$1];for(i=2;i<NF;i++)b[$1,i]+=$i} END{len=asorti(a,tA);for(i=1;i<=len;i++){printf tA[i];for(j=2;j<NF;j++)printf FS""b[tA[i],j];print FS}}' urfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP