如何用gvpr/Graphviz筛选含foo的节点及其直接关联节点?
提取指定节点及直接关联节点的Graphviz解决方案
方法一:使用gvpr脚本处理
1. 编写过滤脚本
创建名为filter-foo-related.gvpr的脚本,内容如下:
BEGIN { // 收集所有名称包含"foo"的节点到集合A node_t A[]; int nodeCount = 0; for (node_t currNode = fstnode(); currNode; currNode = nxtnode(currNode)) { if (strstr(currNode.name, "foo") != NULL) { A[nodeCount++] = currNode; } } // 标记需要保留的节点:A内节点 + 直接相连的节点 for (int i = 0; i < nodeCount; i++) { node_t targetNode = A[i]; targetNode.keep = 1; // 标记目标节点保留 // 标记所有出边指向的节点 for (edge_t outEdge = fstout(targetNode); outEdge; outEdge = nxtout(outEdge)) { outEdge.head.keep = 1; } // 标记所有入边来源的节点 for (edge_t inEdge = fstin(targetNode); inEdge; inEdge = nxtin(inEdge)) { inEdge.tail.keep = 1; } } } // 删除未标记的节点 N { if (!N.keep) { delete(N); } } // 删除两端节点都被移除的边 E { if (!E.tail.keep || !E.head.keep) { delete(E); } }
2. 执行处理命令
在终端运行以下命令,将bar.dot处理后输出到新文件:
gvpr -f filter-foo-related.gvpr bar.dot > filtered-bar.dot
3. 验证输出结果
可以用Graphviz将处理后的DOT文件转为可视化图片:
dot -Tpng filtered-bar.dot -o filtered-bar.png
方法二:直接使用gvpr命令行参数
如果不想创建单独脚本,可将逻辑直接写入命令行:
gvpr 'BEGIN{node_t A[];int c=0;for(n=fstnode();n;n=nxtnode(n))if(strstr(n.name,"foo"))A[c++]=n;for(int i=0;i<c;i++){A[i].keep=1;for(e=fstout(A[i]);e;e=nxtout(e))e.head.keep=1;for(e=fstin(A[i]);e;e=nxtin(e))e.tail.keep=1;}}N{if(!N.keep)delete(N);}E{if(!E.tail.keep||!E.head.keep)delete(E);}' bar.dot > filtered-bar.dot
内容的提问来源于stack exchange,提问作者pseudorandomdev
相关产品推荐
相关产品推荐

