在另一条线上反向匹配多个场

时间:2018-02-20 20:25:37

标签: bash awk

我想写的逻辑如下:

如果当前行的第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

1 个答案:

答案 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