2015-04-23 3 views
0

Файл 1:Как получить строки в одном файле, содержащие строку (с повторением) в другом файле?

a 
a 
b 
c 
d 

Файл 2:

a a1 
b b1 
e e1 
f f1 

Мой желаемый результат:

a a1 
a a1 
b b1 

Я пытаюсь реализовать это с помощью Баш или Python.

В питоне я попробовал:

f1=open("file1") 
f2=open("file2") 
dpo1=f1.readlines() 
dpo2=f2.readlines() 

for i in dpo2: 
    for j in dpo1: 
     if j in i: 
      print i 

В Баш я попробовал:

awk 'NR == FNR { ++h[tolower($1)]; next; } h[tolower($1)]' file1 file2 

Но это не считает повторы. Он даст выход

a a1 
b b1 

Любые идеи?

+0

Что код питона делать? –

+0

проверил только последнюю строку в файле 1. Что вернуло одно совпадение вместо того, чтобы возвращать соответствие для всех остальных строк в файле.(в действительности мой файл1 является подмножеством файла2, поэтому я знаю это) – HackCode

ответ

1

Вот один из способов вы можете сделать это с помощью AWK:

$ awk 'NR==FNR{a[$1]=$2;next}$0 in a{print $0,a[$0]}' file2 file1 
a a1 
a a1 
b b1 

Прочитайте пары ключ-значение из второго файла в массив a, затем напечатайте те, которые соответствуют.

3

присоединиться именно то, что вам нужно:

$ join f1 f2 
a a1 
a a1 
b b1 

см man join для более подробной информации

0

Сначала прочитайте file2, а затем прочитать file1

awk '{if(FNR==NR) {# first file 
      data[$1]=$2} 
     else { # second file 
      if($1 in data) print $1, data[$1]}' file2 file1 

Внутренние переменные NR и FNR являются, соответственно, количество текущей записи во входном потоке и номер записи в текущем файле, так они равны, только когда awk читает 1-й файл.

Если мы читаем 1-й файл, мы строим ассоциативный массив , содержащий второе поле, проиндексированное первым.

Если мы читаем первый файл, мы проверяем, если одно поле в нем содержится в ассоциативном массиве (проверка производится по индексов ассоциативного массива), и если мы находим выход матча мы текущий ключ и соответствующее значение.

1

Вы могли бы сделать словарь из второго файла и отобразить каждый ключ из первого файла с соответствующим значением:

text = open("file2.txt").read().splitlines() 

keys = [i.split()[0] for i in text] 
values = [i.split()[1] for i in text] 
dic = dict(zip(keys, values)) 

# Now you have: 
#dic = {'b': 'b1', 'e': 'e1', 'f': 'f1', 'a': 'a1'} 

text = open("file1.txt").read().splitlines() 

try: 
    for word in text: 
     print(word, dic[word]) 
except KeyError: 
    pass 

Выход:

a a1 
a a1 
b b1 
>>> 
+1

'dic = dict (line.strip(). split() для строки в open (" file2.txt "))' –

+0

Спасибо! Это более элегантно, чем то, что я написал. – Omid

Смежные вопросы