免费注册 查看新帖 |

Chinaunix

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

求合并文本处理脚本 [复制链接]

论坛徽章:
0
发表于 2011-03-10 12:37 |显示全部楼层
我有两个文件
1.unl内容如下:
4300|54.1|52.0|
4301|20|20|
4302|20|20|
4303|14|12|

2.unl内容如下:
4300|86.1|82.1|
4301|42.1|43.1|
4302|40.5|40|

我想得到如下的结果:
4300|54.1|52.0|86.1|82.1|
4301|20|20|42.1|43.1|
4302|20|20|40.5|40|
4303|14|12|0|0|

请高手解答一下,谢谢。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-03-10 12:53 |显示全部楼层
回复 1# ztj111


    try:
  1. $ awk 'NR==FNR{a[$1]=$2;b[$1]=$3}NR>FNR{print $0 (a[$1]?a[$1]:"0") FS (b[$1]?b[$1]:"0") FS}' FS="|" 2.file FS="|" 1.file
  2. 4300|54.1|52.0|86.1|82.1|
  3. 4301|20|20|42.1|43.1|
  4. 4302|20|20|40.5|40|
  5. 4303|14|12|0|0|
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-03-10 12:55 |显示全部楼层
join -a1 -a2 -t'|' t002 t003|tr -s '||' '|'
4300|54.1|52.0|86.1|82.1|
4301|20|20|42.1|43.1|
4302|20|20|40.5|40|
4303|14|12|

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2011-03-10 13:07 |显示全部楼层
awk -F"|" '{a[$1]=a[$1]FS$2FS$3}END{for(i in a){if(split(a[i],b,"|")==3){a[i]=a[i]"|0|0"}print i""a[i]FS}}'  1.unl 2.unl

论坛徽章:
0
发表于 2011-03-10 13:26 |显示全部楼层
功能都可以,大家可以简单解释一下么

论坛徽章:
0
发表于 2011-03-10 22:23 |显示全部楼层
同事写的一个更通用的:
awk -F'|' '{data="";for(i=2;i<NF;i++){data=data"|"$i};a[$1]=a[$1]data}END{for(i in a){print i""a[i]}}' file1 file2 | sort -k1

论坛徽章:
0
发表于 2011-03-11 05:29 |显示全部楼层
本帖最后由 sk1418 于 2011-03-11 08:13 编辑

前面的awk是不是都有个小问题?

比如文件1里不存在一个KEY,但是文件2里存在,那结果就应该是

key|0|0|v1|v2| 吧? 这个好像都没考虑到?


这样行么?笨了点
  1. awk -F'|' 'NR==FNR{a[$1]=$2 FS $3 FS ;} NR>FNR{ if($1 in a) a[$1]=a[$1]$2 FS $3 FS ; else a[$1]="0|0|"$2 FS $3 FS } END{for (i in a){ if (split(a[i],b,FS)<4) a[i] = a[i]"0|0|" print i FS a[i] } }' f2.txt f1.txt
复制代码

论坛徽章:
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
发表于 2011-03-11 09:22 |显示全部楼层
  1. sort urfile1 urfile2|sed ':n;N;/^\(\([^|]\+\).*\)\n\2|/s//\1/;tn;P;D'
复制代码

论坛徽章:
0
发表于 2011-03-11 09:51 |显示全部楼层
join -a1 -a2 -t'|' t002 t003|tr -s '||' '|'
4300|54.1|52.0|86.1|82.1|
4301|20|20|42.1|43.1|
4302| ...
昭襄王 发表于 2011-03-10 12:55


   
    非常棒的针对性运用,我想请教一下啊,就是如果需求是组合的最后一行里一定需要下面这种情况,有什么办法吗?
    4303|14|12|0|0|

论坛徽章:
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
发表于 2011-03-11 10:02 |显示全部楼层
回复 9# fengfeng919


    在join里指定输出格式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP