2013-03-27 49 views
2

我在GraphViz的创建图表,我需要每一个连接是显示只有一次,如何将使用Linux命令该输入?获取独特的线条

INPUT

aa -- bb[label=xyz] 
ab -- bb[label=yzx] 
aa -- bb[label=zxy] 
ac -- ab[label=xyz] 
bb -- aa[label=xzy] 

所需的输出:

aa -- bb[label=xyz] 
ab -- bb[label=yzx] 
ac -- ab[label=xyz] 

所以aa -- bb等于bb -- aa,需要去除。

我试图sort -k1,2 -u -t[ BOT它没有与[分隔符的工作,不知道如何检查 “反向” 条目( “XX - YY”= “YY - ××”)

回答

4

下面是使用awk的方法:

$ awk -F'[[]| -- ' '!a[$1,$2]++&&!a[$2,$1]' file 
aa -- bb[label=xyz] 
ab -- bb[label=yzx] 
ac -- ab[label=xyz] 
+2

+1,这个好球 – 2013-03-27 16:32:30

0

可以specifify [作为分隔符这种方式:

sort -k2 -u -t'[' 

这是否给你你需要什么?

+0

这是行不通的,因为它没有把'AA - bb'和'BB - aa'相等。 – 2013-03-27 16:20:24

+0

确定。需要更多思考。 – SteveP 2013-03-27 16:23:04

+0

我尝试了太多,但排序不接受任何“特殊”的字符,除了字母数字字符分隔符这样 – Buksy 2013-03-27 16:23:54

0

这里有一个想法(未测试,但应接近):

sed -e 's/[[].*// -e 's/-- //' input.txt | 
    awk '{ if ((e[$1$2] != 1) && (e[$2$1] != 1)) 
     { print $1, $2 
      e[$1$2] = e[$2$1] = 1 
     } 
     }' 

sed ...位带出--[label...]部分因为你似乎并不关心他们,然后awk跟踪哪些对已经看到了无论是为了只打印他们,如果他们没有见过的。

+1

这将是很难比[sudo_O响应(HTTP简单和更清洁:/ /stackoverflow.com/a/15664062/465183)=) – 2013-03-27 17:05:41