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
[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
9080 : /ErrorPageA : HttpErrorHandler : * : localhostNode01 : server1 : cluster2 : root : STARTED
9080 : /wasPerfTo : perfServletApp : * : localhostNode01 : server1 : cluster2 : root : STARTED
复制代码
作者:
songyc_2015
时间:
2015-08-06 13:27
回复
1#
Georgescott
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
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