удалить "пересечённые" дубликаты записей

Нужно удалить дубликаты записей, в которых пересекаются одинаковые значения из разных колонок.

К примеру вот что у меня есть (жирым я выделил ДУБЛИКАТЫ):

    meshnode-01 meshnode-04 100/100
    meshnode-01 meshnode-03 100/100
    meshnode-01 meshnode-05 81/82
    meshnode-01 meshnode-02 89/85
    meshnode-02 meshnode-05 100/100
    meshnode-02 meshnode-04 83/93 
    meshnode-02 meshnode-01 85/88
    meshnode-02 meshnode-03 97/97
    meshnode-03 meshnode-01 100/100
    meshnode-03 meshnode-04 83/72
    meshnode-03 meshnode-05 93/97
    meshnode-03 meshnode-02 95/97
 

То есть записи "meshnode-01 meshnode-03" и "meshnode-03 meshnode-01" в данном случае это дубликаты. Вот что мне нужно получить:

    meshnode-01 meshnode-04 100/100
    meshnode-01 meshnode-05 81/82
    meshnode-02 meshnode-05 100/100
    meshnode-02 meshnode-04 83/93
    meshnode-02 meshnode-01 85/88
    meshnode-03 meshnode-01 100/100
    meshnode-03 meshnode-04 83/72
    meshnode-03 meshnode-05 93/97
    meshnode-03 meshnode-02 95/97

Пытался различные варианты сортировок, но всё бестолку, на ум приходит только засунуть всё в массив и "переворачивать" каждую запись, а затем построчно сравнивать каждую с оригиналом. Но это слишком сложно даже в мыслях, может есть идеи попроще?

Вот сам скрипт которым я получаю данный список:

#!/bin/bash

nodes="meshnode-01 meshnode-02 meshnode-03"

for a in ${nodes}
do
    while read line
    do
        echo "$a $line"
    done < ${a}.list
done

Значения хранятся в разных файлах:

ls -l *.list
-rw-r--r-- 1 root root 124 Apr 11 12:48 meshnode-01.list
-rw-r--r-- 1 root root 123 Apr 11 12:48 meshnode-02.list
-rw-r--r-- 1 root root 122 Apr 11 12:48 meshnode-03.list

UPDATE: сначала не стал добавлять колонку "link quality", а сейчас понял что её присутствие в примире ВАЖНО. В общем здесь нельзя просто свалить всё в одну кучу и отфильтровать одинаковое, так как присутствует третья колонка, которая должна быть привязана к записи.


Ответы (1 шт):

Автор решения: eri

На питоне через словарь с ключами

import glob
lines=[]
for fname in glob.glob('*.list'):
    lines += open(fname,'r').readlines()


lines = [ l.split() for l in lines ]
lmap = dict()

for m1,m2,ccq in lines:
    lmap[tuple(sorted([m1,m2]))] = m1,m2,ccq


for v in lmap.values():
    print(*v)
→ Ссылка