【问题标题】:Get unique lines获得独特的线条
【发布时间】:2013-03-27 16:10:18
【问题描述】:

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

【问题讨论】:

    标签: linux bash awk unique delimiter


    【解决方案1】:

    这是一个使用awk的方法:

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

    【讨论】:

      【解决方案2】:

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

      sort -k2 -u -t'['
      

      这能满足你的需要吗?

      【讨论】:

      • 这不起作用,因为它不会将aa -- bbbb -- aa 视为平等。
      • 好的。需要考虑更多。
      • 我也试过了,但是 sort 不接受任何“特殊”字符作为分隔符,除了字母数字字符
      【解决方案3】:

      这是一个想法(未经测试,但应该很接近):

      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 跟踪已按任一顺序看到的对并且仅打印如果他们还没有被看到的话。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2019-12-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多