我有一个配置文件,其中包含重复的行组(但组中的行数不同),我希望将其合并为单个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"编辑:略微更新了配置,描述可能有两次LAG-x数字。编辑2:已更新添加lacp值以获取每条csv线路的管理员密钥。
发布于 2019-10-02 21:58:36
你能不能试着跟上。
awk -v OFS="," '
{
gsub(/\r/,"")
sub(/^ +/,"")
}
/lag/{
ind=$2
next
}
/description/ && match($0,/\".*\"/){
des=substr($0,RSTART,RLENGTH)
next
}
/port/{
print ind,des,$2
}
' Input_file如果您的字符串可能是大写或小写字母或混合,那么您可以在上面的代码中添加一个带有IGNORECASE=1的BEGIN部分,它应该在任何情况下都与字符串匹配。
说明:以下内容仅作说明之用,请参考以上完整代码。
-v OFS=","将所有行的输出字段分隔符设置为逗号。
gsub(/\r/,"")根据OP的注释,将\r控制m个字符全局替换为NULL。
sub(/^ +/,"")在这里用NULL替换行的初始空格。
/lag/{Ind=$2;next}搜索其中有字符串滞后的行,并创建值为$2的变量Ind,next将跳过从此处开始的所有后续语句。
/description...../查找其中包含字符串描述的行,然后使用awk的匹配函数查找同一行中从"到"的正则表达式。将匹配的regex值保存在名为desc的变量中,next将跳过此处的所有后续语句。
/port/...查找其中包含字符串端口的行,然后根据OP的要求在此处打印ind,des,$2的值。
发布于 2019-10-02 23:21:28
$ cat tst.awk
BEGIN { OFS="," }
{
tag = $1
sub(/^[[:space:]]*[^[:space:]]+[[:space:]]*/,"")
vals[++numVals] = $0
}
tag == "exit" {
for (valNr=3; valNr<numVals; valNr++) {
print vals[1], vals[2], vals[valNr]
}
numVals = 0
}
$ awk -f tst.awk file
1,"LAG-1 GOES TO LAG-2",1/2/1
1,"LAG-1 GOES TO LAG-2",1/2/2
1,"LAG-1 GOES TO LAG-2",3/2/3
10,"REMOVED-LAG-10-0.0.0.0",4/1/1
10,"REMOVED-LAG-10-0.0.0.0",5/1/1
11,"REMOVED-LAG-11-4.4.4.4",5/1/2发布于 2019-10-02 23:00:18
另一个awk:
awk '$1~/lag/{l=$2;next}
$1~/description/{d=substr($0,index($0,"\""));next}
$1~/port/{print l,d,$2}
' OFS=, file前两个语句将第二个字段分别放入l和d变量中,分别用于lag和description关键字。
最后一条语句打印2个变量和与port关键字关联的第二个字段。
https://stackoverflow.com/questions/58202817
复制相似问题