Chinaunix

标题: awk 文件合并数组并添加列的一个实际案例咨询(急,感谢!) [打印本页]

作者: Georgescott    时间: 2015-08-06 10:25
标题: awk 文件合并数组并添加列的一个实际案例咨询(急,感谢!)
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



作者: tuyajie    时间: 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
复制代码

作者: songyc_2015    时间: 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
复制代码

作者: Georgescott    时间: 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
作者: songyc_2015    时间: 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
复制代码
是这个意思么?
作者: tuyajie    时间: 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
作者: Georgescott    时间: 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


作者: jason680    时间: 2015-08-24 17:17
回复 7# Georgescott

for(...){
  if($n=="")$n="NULL"
}
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2