提取边缘列表中的特定行

时间:2018-10-29 10:13:52

标签: awk

我有一个大型网络文件,其中包含数百万个未定向边缘 edge.txt ,其中包含节点1 节点2 和一些数字属性

{
  "students": [
    {
      "name": "Hendrick",
      "country": "UK"
    },
    {
      "name": "Mikey",
      "country": "UK"
    }
  ]
}

提供另一个文件 input.txt

a   b   0.8
b   c   0.1
d   f   0.7
e   f   0.5
c   b   0.1
b   a   0.8
a   c   0.1

仅应打印在 input.txt

中具有两个节点(node1和node2)的那些边缘
a
b
c

我尝试过:

a   b   0.8
b   c   0.1
a   c   0.1

需要一些建议吗?谢谢

3 个答案:

答案 0 :(得分:3)

您可以尝试以下awk脚本:

awk 'NR==FNR{a[$1];next}($1 in a)&&($2 in a)' input.txt edge.txt

数组查找需要用括号括起来,并且不需要print语句(因为这是条件有效时的默认语句)。

答案 1 :(得分:1)

如果edge >>输入,则另一种尝试最小化对哈希b的查找:

$ awk '
NR==FNR && !($1 in a) {   # if node not in hash a yet, ie. remove duplicates in input
    for(i in a) {         # "c" -> a[]: insert to b: ca, ac, cb, bc
        b[$1 i]
        b[i $1]
    }
    a[$1]                 # new entries go to a as well
    next
}
($1 $2 in b) {
    # delete b[$1 $2]     # uncomment these to remove duplicates
    # delete b[$2 $1]     # ie. "a b 0.8" vs. "b a 0.8"
    print
}' input edge  # if both $1 and $2 are in a, $1 $2 is in b

输出:

a   b   0.8
b   c   0.1
c   b   0.1
b   a   0.8
a   c   0.1

删除重复项:

a   b   0.8
b   c   0.1
a   c   0.1

答案 2 :(得分:1)

@oliv的方法是正确的方法,但是如果要删除转置对,则需要添加一些条件

$ awk 'NR==FNR{a[$1]=1; next} a[$1] && a[$2] && !b[$1,$2]++ && !b[$2,$1]++' input edge

a   b   0.8
b   c   0.1
a   c   0.1