免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 文件合并数组并添加列的一个实际案例咨询(急,感谢!) [复制链接]

论坛徽章:
0
发表于 2015-08-06 10:25 |显示全部楼层
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 -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' s10.txt t11.txt > r1.txt


论坛徽章:
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
发表于 2015-08-06 11:20 |显示全部楼层
  1. [jay.liu@aliCloud ~]$ awk 'NR==FNR{a[$1]=$2}NR!=FNR{for(i in a){if($11==i) print $0,":",a[i]}}' s10.txt t11.txt
  2. 9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
  3. 9080 : /wasPerfTo : perfServletApp : * : localhostNode01 : server1 : cluster2 : root : STARTED
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-08-06 13:27 |显示全部楼层
回复 1# Georgescott
  1. awk 'FNR==NR{a[$1]=$2;next}{FS="[ :]+";$0=$0}{print $0,a[$6]}' OFS=" : " a b
复制代码

论坛徽章:
0
发表于 2015-08-06 13:30 |显示全部楼层
非常感谢! 再加深下难度和算法的兼容性哈 -- 继续问下 --

最后加上的一列 如果字符不是 STARTED ,其他的字符 类似 be 就都用 STOPPED 替代,如何写?

上面算法得到的类似现在的表现形式 --
9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
9080 : /wasPerfTo : perfServletApp : * : localhostNode01 : server1 : cluster2 : root : STARTED
....                                                                                                                                 : be


需要的表现形式 --

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

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-08-06 13:41 |显示全部楼层
回复 4# Georgescott
  1. awk 'FNR==NR{a[$1]=$2;next}{FS=" : ";$0=$0}{s=a[$6]=="STARTED"?a[$6]:"STOPPED";print $0,s}' OFS=" : " a b
复制代码
是这个意思么?

论坛徽章:
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
发表于 2015-08-06 13:44 |显示全部楼层
awk 'NR==FNR{a[$1]=($2=="STARTED")?$2:"STOPPED"}NR!=FNR{for(i in a){if($11==i) print $0,":",a[i]}}' s10.txt t11.txt

论坛徽章:
0
发表于 2015-08-24 16:56 |显示全部楼层
非常感谢! 再加深下算法的兼容性哈 -- 继续问下 --

继续加深的第三问:如果有的列的值为空值,即为空格,如何判断并用相关的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
发表于 2015-08-24 17:17 |显示全部楼层
回复 7# Georgescott

for(...){
  if($n=="")$n="NULL"
}
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP