免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fcbqs1989
打印 上一主题 下一主题

[文本处理] 请问一下如何用awk合并下面2个文件 [复制链接]

论坛徽章:
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
31 [报告]
发表于 2013-01-26 13:23 |只看该作者
回复 30# fcbqs1989


    用awk可以。不过问题描述还不是很清楚。
如果a中有一行 -0.2099959180E+05   -0.1377769434E+05    0.2908521973E+04
而b中有这样一行-2.0999592e+04  -1.3777694e+04   2.9085220e+03   3.3413230e+03

那么结果是?

论坛徽章:
0
32 [报告]
发表于 2013-01-26 13:30 |只看该作者
本帖最后由 fcbqs1989 于 2013-01-26 13:33 编辑

回复 31# blackold


如果a中有一行 -0.2099959180E+05   -0.1377769434E+05    0.2908521973E+04
而b中有这样一行-2.0999592e+04  -1.3777694e+04   2.9085220e+03   3.3413230e+03

那么结果是?


嘿嘿,结果就是
-0.2099959180E+05   -0.1377769434E+05    0.2908521973E+04 3.3413230e+03
或者,
-20999.59 -13777.79 2908.52 3341.32

其实输出的格式不重要,重要的是第4列的数值要匹配前3列的坐标。

那个例子我可能写错了。输出应该按照a的前3列来~~~









论坛徽章:
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
33 [报告]
发表于 2013-01-26 14:01 |只看该作者
回复 32# fcbqs1989
  1. $ awk '{for(i=1;i<4;i++)$i=sprintf("%.2E",$i)}NR==FNR{a[$1,$2,$3]=$4;next}{i=$1 SUBSEP $2 SUBSEP $3;if(i in a)print $0,a[i]}' b.txt a.txt
复制代码
根据27楼的数据,得到的结果为:
-2.10E+04 -1.38E+04 2.91E+03 3.3413230e+03
-2.10E+04 -1.38E+04 2.41E+03 3.2103840e+03
-2.10E+04 -1.38E+04 1.17E+03 2.9276980e+03
-2.10E+04 -1.38E+04 6.54E+02 2.6649160e+03
-2.10E+04 -1.38E+04 4.94E+02 2.6068580e+03
-2.10E+04 -1.38E+04 3.41E+02 2.6309410e+03
-2.10E+04 -1.38E+04 1.92E+02 2.1027280e+03
-2.10E+04 -1.38E+04 4.40E+01 2.0452240e+03
7.12E+03 9.77E+03 -5.05E+02 1.2656620e+03

论坛徽章:
0
34 [报告]
发表于 2013-01-26 14:47 |只看该作者
回复 33# blackold


谢谢你。
我的数据总共170万行左右,不过好像还是有180行没找到。

我估计哪里出了点问题吧。

还是非常谢谢你。

论坛徽章:
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
35 [报告]
发表于 2013-01-26 14:52 |只看该作者
回复 34# fcbqs1989


    方法应该没有问题。

   可以列出那些没有找到的行,看看是什么原因造成的。

论坛徽章:
0
36 [报告]
发表于 2013-01-26 15:34 |只看该作者
本帖最后由 fcbqs1989 于 2013-01-26 15:52 编辑

。。。。。。。。。。。。。。。

论坛徽章:
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
37 [报告]
发表于 2013-01-26 15:36 |只看该作者
回复 36# fcbqs1989

try
  1. $ awk '{for(i=1;i<4;i++){$i=sprintf("%.9E",$i);while($i ~ /\.....*E/)sub(/.E/,"E",$i)}}NR==FNR{a[$1,$2,$3]=$4;next}{i=$1 SUBSEP $2 SUBSEP $3;if(i in a)print $0,a[i]}' b.txt a.txt
复制代码

论坛徽章:
0
38 [报告]
发表于 2013-01-26 15:51 |只看该作者
回复 37# blackold


好难找,还是有错误。我也不知道为什么了。

您那个code确定是按照小数点前面的有效数字的匹配找的么?



论坛徽章:
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
39 [报告]
发表于 2013-01-26 16:32 |只看该作者
本帖最后由 blackold 于 2013-01-26 16:52 编辑

回复 38# fcbqs1989


    对。

37楼代码的输出:
-2.09E+04 -1.37E+04 2.90E+03 3.3413230e+03
-2.10E+04 -1.37E+04 2.41E+03 3.2103840e+03
-2.10E+04 -1.37E+04 1.16E+03 2.9276980e+03
-2.10E+04 -1.37E+04 6.53E+02 2.6649160e+03
-2.10E+04 -1.37E+04 4.94E+02 2.6068580e+03
-2.10E+04 -1.37E+04 3.41E+02 2.6309410e+03
-2.10E+04 -1.37E+04 1.91E+02 2.1027280e+03
-2.10E+04 -1.37E+04 4.39E+01 2.0452240e+03
7.12E+03 9.76E+03 -5.04E+02 1.2656620e+03

论坛徽章:
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
40 [报告]
发表于 2013-01-26 16:37 |只看该作者
回复 38# fcbqs1989


    既然知道有些满足条件的行没有输出,怎么会找不到呢?grep命令比较就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP