2

我正在 graphViz 中创建图形,我需要每个连接只显示一次,如何使用 linux 命令转换此输入?

输入

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[机器人,它不能与[分隔符一起工作,不知道如何检查“反向”条目(“xx -- yy”=“yy -- xx”)

4

3 回答 3

4

这是一种使用方法awk

$ awk -F'[[]| -- ' '!a[$1,$2]++&&!a[$2,$1]' file
aa -- bb[label=xyz]
ab -- bb[label=yzx]
ac -- ab[label=xyz]
于 2013-03-27T16:26:12.817 回答
0

您可以通过这种方式将 [ 指定为分隔符:

sort -k2 -u -t'['

这能满足你的需要吗?

于 2013-03-27T16:14:46.397 回答
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

于 2013-03-27T16:38:11.723 回答