2017-10-19 72 views
1

解析文本我需要关于经由SED,AWK或bash的文本解析的提示:使用sed + AWK +的bash

示例文本:

VRF MediaPlayer 
192.168.1.1 52466 5w12d 
192.168.1.2 52467 3w1d 


VRF Telecom 
10.10.1.1 43432 1d1h 
12.20.1.1 23211 23w1d 
30.30.22.1 43211 14w22d 

预期输出:

192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 

如何将VRF“Name”作为第4列,应该使用什么语法?

问候,

回答

4
awk '/^VRF /{vrf=$2}/^[0-9]/{print$0,vrf}' | column -t 

或纯awk

awk '/^VRF /{vrf=$2} /^[0-9]/{printf("% -30s %s\n",$0,vrf)}' 
+0

@OP:'/ ^([0-9] | $)/ {print $ 0,(NF> 0)?vrf:“”}'如果您需要保留空白记录 – JNevill

0

继AWK也可以帮助你在相同的了。

awk '/^VRF/{val=$2;next} NF{$1=$1;print $0,val;next} 1' OFS="\t" Input_file 
0
$ awk '/^VRF/{vrf=$2; next} {print $0 (NF ? OFS vrf : "")}' file 
192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 
0

使用sed

sed '/VRF /{s///;h;:A;N;s/.*\n//;/^$/!{G;s/\n/ /;p;bA}}' infile 

如果该行不包含 'VRF' 打印什么也没有太行例如

否则替代= MediaPlayer的

和复制保持空间'h'

:A是环

得到一个新行N和删除以前的线S /.* \ n //

如果该行不是空的,复制的保持空间( '的MediaPlayer')在模式空间 'G'

的末尾删除\ N,打印线,并返回到:一个

0

简单AWK溶液

$ awk '/^VRF/{a=$NF; next} NF{$0=$0 FS a}1 ' file 
192.168.1.1 52466 5w12d MediaPlayer 
192.168.1.2 52467 3w1d MediaPlayer 


10.10.1.1 43432 1d1h Telecom 
12.20.1.1 23211 23w1d Telecom 
30.30.22.1 43211 14w22d Telecom 

/^VRF/{a=$NF; next}:如果记录以VRF开始,则将变量a设置为该记录中的最后一个字段。然后next奈何

NF{$0=$0 FS a}1:如果NF再行具有一定的领域,是不是空的,则只需追加a的记录,并打印出来。如果它是空的,请不要追加并简单地打印。