我有一个大型网络文件,其中包含数百万个未定向边缘: 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
需要一些建议吗?谢谢
答案 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