我想写的逻辑如下:
如果当前行的第1列与任何其他行的第3列匹配,并且如果当前行的第3列也与该行的第1列匹配,则打印列#1和第2列#2同一行上的行。
以下是我的输入文件:
接口表(输入):
NODE1 eth1 NODE2
NODE1 eth2 NODE3
NODE2 eth1 NODE1
NODE2 eth2 NODE4
NODE3 eth1 NODE1
NODE3 eth2 NODE4
NODE4 eth1 NODE2
NODE4 eth2 NODE3
链接表(所需的输出):
NODE1 eth1 NODE2 eth1
NODE1 eth2 NODE3 eth1
NODE2 eth2 NODE4 eth1
NODE3 eth2 NODE4 eth2
下面是一个说明这一点的网络图。
NODE1--eth1---link1---eth1--NODE2
| |
eth2 eth2
| |
| |
link2 NETWORK link3
| |
| |
eth1 eth1
| |
NODE3--eth2---link4---eth2--NODE4
编辑2018-03-01
我添加了一个额外的列,并且还要打印它。
输入:
NODE1 adapter1 eth1 NODE2
NODE1 adapter2 eth2 NODE3
NODE2 adapter1 eth1 NODE1
NODE2 adapter2 eth2 NODE4
NODE3 adapter1 eth1 NODE1
NODE3 adapter2 eth2 NODE4
NODE4 adapter1 eth1 NODE2
NODE4 adapter2 eth2 NODE3
输出
NODE1 adapter1 eth1 adapter1 NODE2 eth1
NODE1 adapter2 eth2 adapter1 NODE3 eth1
NODE2 adapter2 eth2 adapter2 NODE4 eth1
NODE3 adapter2 eth2 adapter2 NODE4 eth2
答案 0 :(得分:3)
短 awk
解决方案:
awk '$3","$1 in a{ print $3, a[$3","$1], $1, $2 }{ a[$1","$3]=$2 }' OFS='\t' file
输出:
NODE1 eth1 NODE2 eth1
NODE1 eth2 NODE3 eth1
NODE2 eth2 NODE4 eth1
NODE3 eth2 NODE4 eth2
Bonus 解决方案,以满足您的附加条件:
awk '($4,$1) in a{ print $4, a[$4,$1], $2, $1, $3 }{ a[$1,$4]=$2 OFS $3 }' OFS='\t' file
输出:
NODE1 adapter1 eth1 adapter1 NODE2 eth1
NODE1 adapter2 eth2 adapter1 NODE3 eth1
NODE2 adapter2 eth2 adapter1 NODE4 eth1
NODE3 adapter2 eth2 adapter2 NODE4 eth2