Сопоставьте два файла с дублирующимися идентификаторами

Один из вариантов, о котором не упоминалось, заключается в том, чтобы сохранить / загрузить ваш / раздел. Если вы регулярно обновляете ядро ​​и сохраняете свою / загрузку на отдельном разделе размером 100-200 МБ, у вас будет много возможностей сделать это.

В большинстве случаев (настольных) систем в настоящее время нет реальной причины, по которой вы должны сохранять отдельную / загрузку. Конечно, некоторые люди не согласятся, но это скорее проблема устаревания, которая вызывает привычку создавать отдельный раздел ext2 для /boot.

1
задан 3 July 2017 в 08:30

7 ответов

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
ответ дан 22 May 2018 в 20:55
  • 1
    Я забил это довольно быстро, потому что уже поздно. Если что-то неясно, оставьте комментарий, и я вернусь к вам завтра. – wjandrea 3 July 2017 в 09:07
  • 2
    Помимо всех '' и () в выходе, отлично работало! Благодаря! – limd 3 July 2017 в 10:02
  • 3
    @limd. Вы запускаете его с Python 2 (python или python2). Запустите его с Python 3 (python3). – wjandrea 3 July 2017 в 15:40
  • 4
    Или удалите круглые скобки из оператора print, чтобы запустить его с Python 2. Я не собирался сделать его 2-совместимым, но, я думаю, это так! – wjandrea 3 July 2017 в 15:42
  • 5
    Да, я понял это и перешел на python3. Большое спасибо! – limd 3 July 2017 в 15:42

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
ответ дан 18 July 2018 в 10:47

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
ответ дан 24 July 2018 в 19:38

Если файлы:

отсортированы; и каждый из них содержит ровно ноль или два вхождения данного индекса

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

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

и скоро. Необычные строки будут игнорироваться (если мы не воспользуемся опцией -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 и т. Д., А [ f6] равно нулю для строк 4,8 и т. д., так что и инверсия верна для 1,4; 5,9 ...

0
ответ дан 22 May 2018 в 20:55

Вот решение 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
ответ дан 22 May 2018 в 20:55

Вот решение 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
ответ дан 18 July 2018 в 10:47

Вот решение 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
ответ дан 24 July 2018 в 19:38

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

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