2015-09-06 72 views
1

我只注意到重复的节点名称(即使标签是唯一的)得到处理没有投诉Graphviz。例如,考虑作为呈现(与圆环)以下简单图表下方的图像中:强制Graphviz抱怨重复的节点

graph { 
     a [label="a1"] 
     a [label="a2"] 
     b 
     c 
     d 
     e 
     a -- b; 
     b -- c; 
     a -- c; 
     d -- c; 
     e -- c; 
     e -- a; 
} 

A simple graph with two duplicate nodes a

我想上述图形具有两个节点:A1和A2。所以我知道我应该用独特的名字来实例化它们(不同于我上面做的)。但是在大图中,我可能没有注意到我错误地实例化了两个名称相同的不同节点。所以如果我做这样的事情,我想强迫Graphviz抱怨它或以某种方式引起我的注意,可能会带有警告或错误消息。

我该如何做到这一点?

+0

节点在点文件中多次出现是完全合法的。即使你这样认为,也没有明确的节点创建,节点是在其第一次出现时隐式创建的。没有办法将'想要的'创作与'不想要的'创作区分开来。另外,如果您害怕命名错误的节点,您会如何找到名称错误且没有碰撞的节点? – stefan

回答

1

所有graphviz程序默默合并具有重复名称的节点,我找不到任何方式让它们在执行此操作时产生警告。但是,由于我们只需要查找自己声明节点的情况,而不是在声明边时隐式声明的节点(在这种情况下复制是正常的和预期的),我们只需要找到所有节点名称并识别重复项。

如果不超过一个节点曾经上线宣称,这可以用下面的脚本来完成:

#!/bin/sh 
sed -n 's/^[\t ][\t ]*\([_a-zA-Z][_a-zA-Z0-9]*\) *\(\[.*\)*;*$/\1/ p' | \ 
sort | uniq -c | awk '$$1>1' 

如果我们把这个脚本findDupNodes,我们可以按照如下运行:

$ findDupNodes <duplicates.gv 
     2 a 

该脚本查找自己声明的节点名称,或者使用以[开头的属性列表进行排序,对它们进行排序,统计每个节点声明的次数(使用uniq -c),并筛选出那些节点名称t只声明一次。

多个节点可以在同一行(例如a; b; c; d;)声明,但是这个剧本不处理的情况下,或(可能)其他一些情况下 - 其中大部分可能会需要一个全面的xdot语言解析器。

不过,这个脚本应该找到很多重复的节点名称,可能会找到手写的graphviz脚本。

+0

我永远不会在同一行上声明多个节点,所以这个脚本对我来说是非常有用的。非常感谢! – Osteoboon