Сопоставьте два файла с одинаковыми идентификаторами

У меня есть два файла с одинаковыми идентификаторами. Один файл имеет 150 идентификаторов, но поскольку все они существуют как дубликаты, существует 300 идентификаторов. Файл 2 имеет 1500 идентификаторов, но поскольку все идентификаторы существуют в дубликатах, он имеет 3000 идентификаторов. Я хочу сопоставить первое вхождение каждого идентификатора в файле один с первым вхождением идентификатора в файле 2 и 2-е вхождение того же идентификатора со вторым точным идентификатором в файле 2. Если значение идентификатора во 2-м столбце совпадает, то печать совпадает с другим значением несоответствие.

File1:

1 12
1 13
2 15
2 16
4 15 
4 18

File2:

1 13
1 13
2 15
2 17
3 12
3 12
4 15 
4 18
5 14
5 14

Желаемый вывод (Id, столбец 2 из файла 1, столбец 2 из файла 2, совпадение или несоответствие) :

1 12 13 mismatch
1 13 13 match
2 15 15 match
2 16 17 mismatch
4 15 15 match
4 18 18 match
1
задан 3 July 2017 в 08:30

3 ответа

Python3

#!/usr/bin/env python3

import sys

def make_id_dict(f):
  d = {}
  for line in open(f):
    k, v = line.split()
    if k in d:
      d[k] += [ v ]
    else:
      d[k] = [ v ]
  return d


filename1 = sys.argv[1]
filename2 = sys.argv[2]

dict1 = make_id_dict(filename1)
dict2 = make_id_dict(filename2)

for key in sorted(dict1):
  for i, value1 in enumerate(dict1[key]):
    value2 = dict2[key][i]
    if value1 == value2:
      result = 'match'
    else:
      result = 'mismatch'
    print(key, value1, value2, result)

Сохраните как сценарий match-files-by-ids.py затем вызов:

$ python3 match-files-by-ids.py File1 File2
1 12 13 mismatch
1 13 13 match
2 15 15 match
2 16 17 mismatch
4 15 15 match
4 18 18 match
1
ответ дан 7 December 2019 в 15:33

Если файлы:

  • оба отсортированы; и
  • каждый содержит точно нуль или два случаев данного индекса

затем, если мы join их, мы получим четыре "соответствия" для каждого pairable идентификатора т.е.

1st IDn from File1 against 1st IDn from File2
1st IDn from File1 against 2nd IDn from File2
2nd IDn from File1 against 1st IDn from File2
2nd IDn from File1 against 2nd IDn from File2

и так далее. Строки Unpairable будут проигнорированы (если мы не будем использовать -a опция). Мы можем затем просто выбрать первую и четвертую строку от каждой группы соответствия и сравнить их соответствующие вторые поля:

$ join File1 File2 | 
  awk '!((NR-1)%4 && NR%4) {$4 = $3==$2 ? "match" : "mismatch"; print}'
1 12 13 mismatch
1 13 13 match
2 15 15 match
2 16 17 mismatch
4 15 15 match
4 18 18 match

где (NR-1)%4 нуль для строк 1,5,9 и т.д. и NR%4 нуль для строк 4,8 и т.д. так выполнение операции "И", и инвертирование верно для 1,4; 5,9...

0
ответ дан 7 December 2019 в 15:33

Вот awk решение:

awk '
  NR==FNR {
    if ($1 in a) 
      b[$1]=$2; 
    else 
      a[$1]=$2; 
    next;
  } 
  ($1 in a) {
    print $1, a[$1], $2, $2 == a[$1] ? "match" : "mismatch";
    delete a[$1];
    next;
  }
  ($1 in b) {
    print $1, b[$1], $2, $2 == b[$1] ? "match" : "mismatch";
  }' File1 File2

Тестирование:

$ awk '
  NR==FNR {if ($1 in a) b[$1]=$2; else a[$1]=$2; next} 
  ($1 in a) {print $1, a[$1], $2, $2 == a[$1] ? "match" : "mismatch"; delete a[$1]; next; }
  ($1 in b) {print $1, b[$1], $2, $2 == b[$1] ? "match" : "mismatch";}
' File1 File2
1 12 13 mismatch
1 13 13 match
2 15 15 match
2 16 17 mismatch
4 15 15 match
4 18 18 match
0
ответ дан 7 December 2019 в 15:33

Другие вопросы по тегам:

Похожие вопросы: