将 2 个文件与具有多个匹配项的 TCL 进行比较
compare 2 files with TCL with multiple matches
我的问题是基于这个:How to look for the difference between two large files in tcl? and this: Compare columns between 2 files using TCL条目。我想将 2 个文件与另一个文件进行比较。我无权访问 TCLLIB。这些解决方案的问题是,它无法识别重复行。示例:
文件 1
interface Vlan1
description LAN
shutdown
ip address 172.16.1.1 255.255.255.0
interface Vlan2
description LAN
ip address 172.16.2.1 255.255.255.0
interface Vlan3
description LAN
shutdown
ip address 172.16.3.1 255.255.255.0
文件 2
interface Vlan1
description LAN
ip address 172.16.1.1 255.255.255.0
interface Vlan2
description LAN
ip address 172.16.2.1 255.255.255.0
interface Vlan3
description LAN
shutdown
ip address 172.16.3.1 255.255.255.0
所以这些解决方案只是逐行查看并查找例如关机条目。因此脚本不会提醒配置存在差异,因为行关闭确实存在于第二个文件中的某处。那么我该如何纠正呢?如果我能以某种方式动态识别 'block' 并将内容与第二个文件中的同一块进行比较。但我不知道如何完成这个。有人可以引导我走向正确的方向吗?
这里有一些技巧:我正在基于这些文件创建一个 DSL,以便它们可以 source
d 作为 Tcl 代码:
proc interface {name} {
set ::current $name
}
proc description {args} {
dict set ::interfaces $::current description $args
}
proc shutdown {} {
dict set ::interfaces $::current shutdown true
}
proc ip {address args} {
dict set ::interfaces $::current ip $args
}
proc handle {filename} {
set ::interfaces [dict create]
source $filename
return $::interfaces
}
主要的问题是过度使用全局变量。
但我们可以做到:
% set file1_data [handle file1]
Vlan1 {description LAN shutdown true ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}
% set file2_data [handle file2]
Vlan1 {description LAN ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}
您可以按照自己喜欢的方式比较这两个词典。
我的问题是基于这个:How to look for the difference between two large files in tcl? and this: Compare columns between 2 files using TCL条目。我想将 2 个文件与另一个文件进行比较。我无权访问 TCLLIB。这些解决方案的问题是,它无法识别重复行。示例:
文件 1
interface Vlan1
description LAN
shutdown
ip address 172.16.1.1 255.255.255.0
interface Vlan2
description LAN
ip address 172.16.2.1 255.255.255.0
interface Vlan3
description LAN
shutdown
ip address 172.16.3.1 255.255.255.0
文件 2
interface Vlan1
description LAN
ip address 172.16.1.1 255.255.255.0
interface Vlan2
description LAN
ip address 172.16.2.1 255.255.255.0
interface Vlan3
description LAN
shutdown
ip address 172.16.3.1 255.255.255.0
所以这些解决方案只是逐行查看并查找例如关机条目。因此脚本不会提醒配置存在差异,因为行关闭确实存在于第二个文件中的某处。那么我该如何纠正呢?如果我能以某种方式动态识别 'block' 并将内容与第二个文件中的同一块进行比较。但我不知道如何完成这个。有人可以引导我走向正确的方向吗?
这里有一些技巧:我正在基于这些文件创建一个 DSL,以便它们可以 source
d 作为 Tcl 代码:
proc interface {name} {
set ::current $name
}
proc description {args} {
dict set ::interfaces $::current description $args
}
proc shutdown {} {
dict set ::interfaces $::current shutdown true
}
proc ip {address args} {
dict set ::interfaces $::current ip $args
}
proc handle {filename} {
set ::interfaces [dict create]
source $filename
return $::interfaces
}
主要的问题是过度使用全局变量。
但我们可以做到:
% set file1_data [handle file1]
Vlan1 {description LAN shutdown true ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}
% set file2_data [handle file2]
Vlan1 {description LAN ip {172.16.1.1 255.255.255.0}} Vlan2 {description LAN ip {172.16.2.1 255.255.255.0}} Vlan3 {description LAN shutdown true ip {172.16.3.1 255.255.255.0}}
您可以按照自己喜欢的方式比较这两个词典。