免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 文件合并数组并添加列的一个实际案例咨询2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-24 17:15 |只看该作者 |倒序浏览
awk 文件合并数组并添加列的一个实际案例咨询
http://bbs.chinaunix.net/forum.p ... mp;fromuid=30395813

背景:awk 文件合并数组添加列的一个实际案例咨询:

两个文件 s10.txt 和 t11.txt,需要将两个文件进行按数组合并,以第一个文件 s10.txt 的第11个域 关联,如果是s10.txt 的第十一个域和 文件 t11.txt 第一个域相同
(即 以server1的列 进行匹配,两边相同),则 添加t11.txt  的第二个域到到 s10.txt 文件的末尾,用“:” 分割开

s10.txt:
hb1        be
server1        STARTED

t11.txt:
9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root
9080 : /wasPerfTo : perfServletApp : * : localhostNode01 : server1 : cluster2 : root



需要的结果输出:

r1.txt:

9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root:STARTED
9080 : /wasPerfTo : perfServletApp : * : localhostNode01 : server1 : cluster2 : root:STARTED


通过算法:awk 'NR==FNR{a[$1]=($2=="STARTED")?$2:"STOPPED"}NR!=FNR{for(i in a){if($11==i) print $0,":",a}}' s10.txt t11.txt

可以输出结果

9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
9080 :   :   : * : localhostNode01 : server1 : cluster2 : root : START


需要解决的问题:
结果输出的结果需要改进下,如何把每个列都循环的判断下是否为空呢? 请指教?谢谢哈!

非常感谢! 再加深下算法的兼容性哈 -- 继续问下 --

如果有的列的值为空值,即为空格,如何判断并用相关的NULL 代替空格字符?

比如

原来的效果是:

9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
9080 :   :   : * : localhostNode01 : server1 : cluster2 : root : START

需要的效果是:


9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
9080 :   NULL:NULL   : * : localhostNode01 : server1 : cluster2 : root : STARTED

论坛徽章:
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
2 [报告]
发表于 2015-08-24 17:47 |只看该作者

>>两个文件 s10.txt 和 t11.txt,... s10.txt 的第11个域 ...用“:” 分割开

各位大神与楼主...
你们都找得到第11域?
传说中CU的shell版 要有能力 先卜上一卦
看来此事不假

论坛徽章:
11
射手座
日期:2015-08-11 16:10:26辰龙
日期:2015-08-11 16:11:11黑曼巴
日期:2016-04-26 16:58:40
3 [报告]
发表于 2015-08-24 17:55 |只看该作者
本帖最后由 hjfeng1988 于 2015-08-24 17:55 编辑

回复 2# jason680

火眼金睛无压力
   

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
4 [报告]
发表于 2015-08-24 17:58 |只看该作者
本帖最后由 tuyajie 于 2015-08-24 18:01 编辑
  1. awk 'FILENAME=="t11.txt"{FS=":";OFS=":"}
  2.     {$0=$0}
  3.     NR==FNR{a[$1]=($2=="STARTED")?$2:"STOPPED"}
  4.     NR!=FNR{for(m=1;m<=NF;m++){if($m~/^ +$/)$m="NULL";gsub(/ /,"",$m)}; if($6 in a) print $0,a[$6]}' s10.txt t11.txt
复制代码
gsub只是不确定你每个字段前后到底几个空格。。。

论坛徽章:
7
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:18程序设计版块每日发帖之星
日期:2015-08-09 06:20:00每日论坛发贴之星
日期:2015-08-09 06:20:00程序设计版块每日发帖之星
日期:2015-08-22 06:20:00程序设计版块每日发帖之星
日期:2015-08-27 06:20:00
5 [报告]
发表于 2015-08-24 17:58 |只看该作者
本帖最后由 tuyajie 于 2015-08-24 17:59 编辑

$11那一版是我写的。那一版没有用“:”分割
awk 'NR==FNR{a[$1]=($2=="STARTED")?$2:"STOPPED"}NR!=FNR{for(i in a){if($11==i) print $0,":",a}}' s10.txt t11.txt
就用空白符分割
回复 2# jason680


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP