Сравнить два файла и вывести все значения по горизонтали, если идентификаторы совпадают? - PullRequest
1 голос
/ 12 февраля 2020

Привет У меня есть два файла следующим образом: File1.txt

10   A   B  C
10   A   D  K
11   X   Y  Z
10   A   K  B 
11   Y   X  A 

File2.txt

10
11
12

Ожидаемый вывод

10 A  B  C  A  D  K  A  K  B
11 X  Y  Z  Y  X  A 

Я пытался команда grep -f File1.txt file2.txt

Но она не дала мне все значения, приходящие под тем же идентификатором

Ответы [ 4 ]

2 голосов
/ 12 февраля 2020

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  val=$1
  $1=""
  sub(/^ +/,"")
  a[val]=(a[val]?a[val] OFS:"")$0
  next
}
($1 in a){
  print $1,a[$1]
}
' File1.txt File2.txt

Вывод будет следующим:

10 A B C A D K A K B
11 X Y Z Y X A

Объяснение: Добавление подробного объяснения для вышеуказанного кода.

awk '                                ##Starting awk program from here.
FNR==NR{                             ##Checking condition if FNR==NR which will be true for first file1.
  val=$1                             ##Creating variable val with $1 value of it.
  $1=""                              ##Nullify $1 here.
  sub(/^ +/,"")                      ##Substituting initial space with NULL for current line.
  a[val]=(a[val]?a[val] OFS:"")$0    ##Creating array a with index val and keep concatenating its value to it.
  next                               ##next will skip further statements from here.
}
($1 in a){                           ##Checking condition if $1 of current line comes in array a then do following.
  print $1,a[$1]                     ##Printing $1 of current line and value of array a with $1 value.
}
' File1.txt File2.txt                ##Mentioning Input_file names here.
1 голос
/ 12 февраля 2020

Вы можете попробовать это:

with open("File1.txt") as f1, open("File2.txt") as f2:
    dictf1 = {}
    for i in f1.readlines():
        i = i.split()
        if i[0] in dictf1.keys():
            dictf1[i[0]] += i[1:]
        else:
            dictf1[i[0]] = i[1:]
    for i in f2.readlines():
        if i[:-1] in dictf1.keys():
            print(i[:-1], " ".join(dictf1[i.strip()]))
1 голос
/ 12 февраля 2020

Вы можете добавить строку в словарь, если ключ находится во втором файле.
Пример:

from collections import defaultdict

d = defaultdict(list)

with open("f1.txt") as f1, open("f2.txt") as f2:
    keys = set(f2.read().splitlines())
    for line in f1:
        k, *rest = line.split()
        if k in keys:
            d[k]+=rest


>>> print(*d.items(),sep="\n")
('10', ['A', 'B', 'C', 'A', 'D', 'K', 'A', 'K', 'B'])
('11', ['X', 'Y', 'Z', 'Y', 'X', 'A'])
0 голосов
/ 12 февраля 2020

Я не вижу актуальности File2.txt здесь. Таким образом, вы можете использовать эту 1-строчную команду, если интервал вывода не важен:

sort File1.txt | awk '$1!=key {if (sum) print key sum; key=$1; sum=""} {$1=""; sum=sum $0} END {print key sum}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...