我需要通过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"姓名"作为第4列,我应该使用什么语法?
此致
答案 0 :(得分: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)}'
答案 1 :(得分:0)
关注awk也可以帮助你。
awk '/^VRF/{val=$2;next} NF{$1=$1;print $0,val;next} 1' OFS="\t" Input_file
答案 2 :(得分: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
答案 3 :(得分:0)
使用sed
sed '/VRF /{s///;h;:A;N;s/.*\n//;/^$/!{G;s/\n/ /;p;bA}}' infile
如果该行不包含'VRF'打印
其他没有替代,所以line = MediaPlayer例如
并复制保留空间'h'
:A代表循环
获取换行符N并删除上一行s /.* \ n //
如果该行不为空,则复制模式空间'G'末尾的保留空间('MediaPlayer')
删除\ n,打印该行并返回:A
答案 4 :(得分: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
附加到记录并打印即可。如果它是空的,请不要追加并简单地打印。