удалить "пересечённые" дубликаты записей
Нужно удалить дубликаты записей, в которых пересекаются одинаковые значения из разных колонок.
К примеру вот что у меня есть (жирым я выделил ДУБЛИКАТЫ):
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 шт):
На питоне через словарь с ключами
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)