与my previous question类似,但在配置文件示例中添加了其他项。
我有一个配置文件,其中包含重复的行组(但组中的行数不同),我希望将其合并为单个csv行,以便更容易地导入到数据库中。(数据库结构灵活)。
# Example:
lag 1
description "LAG-1 GOES TO LAG-2"
port 1/2/1
port 1/2/2
port 3/2/3
lacp active administrative-key 32770
exit
lag 10
description "REMOVED-LAG-10-0.0.0.0"
port 4/1/1
port 5/1/1
lacp active administrative-key 32771
exit
lag 11
description "REMOVED-LAG-11-4.4.4.4"
port 5/1/2
lacp active administrative-key 32772
exit我最终需要在"lag“和"exit”之间的每个块中使用逗号分隔行,如下所示:
1,"LAG 1 GOES TO LAG-2",32770,1/2/3
1,"LAG 1 GOES TO LAG-2",32770,1/2/2
1,"LAG 1 GOES TO LAG-2",32770,3/2/3
10,"REMOVED-LAG-10-0.0.0.0",32771,4/1/1
10,"REMOVED-LAG-10-0.0.0.0",32771,5/1/1
11,"REMOVED-LAG-11-4.4.4.4",32772,5/1/2 然后,我会像这样导入到一个表中:
lag-id | description | key | port我已经尝试了在这里找到的各种awk一行程序,例如:
awk -v RS="lag" 'NR>1{$1=$1; print RS, $0}' 但这似乎垂直地压缩了线条,所以我最终得到了
exit 3/2/3 "LAG 1 GOES TO LAG-2"
exit 4/2/3 "LAG 10 GOES TO LAG-3"
exit 4/1/1 "LAG 11 GOES TO LAG-21"发布于 2019-10-03 00:14:58
$ cat tst.awk
BEGIN { OFS="," }
{
tag = $1
val = ( match($0,/"[^"]*"/) ? substr($0,RSTART,RLENGTH) : $NF )
if ( tag == "port" ) {
ports[++numPorts] = val
}
else {
vals[++numVals] = val
}
}
tag == "exit" {
for (portNr=1; portNr<=numPorts; portNr++) {
for (valNr=1; valNr<numVals; valNr++) {
printf "%s%s", vals[valNr], OFS
}
print ports[portNr]
}
numPorts = numVals = 0
}
$ awk -f tst.awk file
1,"LAG-1 GOES TO LAG-2",32770,1/2/1
1,"LAG-1 GOES TO LAG-2",32770,1/2/2
1,"LAG-1 GOES TO LAG-2",32770,3/2/3
10,"REMOVED-LAG-10-0.0.0.0",32771,4/1/1
10,"REMOVED-LAG-10-0.0.0.0",32771,5/1/1
11,"REMOVED-LAG-11-4.4.4.4",32772,5/1/2发布于 2019-10-03 00:20:03
你可以尝试一下吗?(因为我是在手机上写的,所以我不能测试它,但应该可以工作)
awk -v OFS="," '
{
gsub(/\r/,"")
sub(/^ +/,"")
}
/lag/{
ind=$2
next
}
/description/ && match($0,/\".*\"/){
desc=substr($0,RSTART,RLENGTH)
next
}
/port/{
a[++count]=$2
next
}
/lacp active/{
for(j=1;j<=count;j++){
print Ind,desc,$NF,a[j]
}
count=""
delete a
}
' Input_filehttps://stackoverflow.com/questions/58205101
复制相似问题