2016-01-12 2 views
1

Я пытаюсь найти значения в FILE1 внутри 2-го столбца FILE2 и распечатать значение из 3-го столбца FILE2 при сопоставлении. Ниже приведен пример моих файлов и результатов:Python - поиск подходящей строки в двух больших текстовых файлах

FILE1: 
1 
2 
3 
4 


FILE2: 
0,1,Y,8 
4,5,6,7 
7,4,X,9 

OUTPUT: 
Y 
X 

Может ли кто-нибудь помочь мне сделать это?

+2

Хорошо, а где он не работал, когда вы его пробовали? – arainone

+0

Привет, я новичок в python, и я понимаю, что я должен использовать его; так как мои файлы находятся вокруг линий 3M. К сожалению, я не мог использовать какой-либо из знакомых скриптов из-за проблемы с размером! – AOp0p

+0

Посмотрите здесь, может быть, вы найдете хороший способ обработки большого файла: http://stackoverflow.com/questions/19548193/python-large-files-how-to-find-specific-lines-with- a-specific-string –

ответ

1

Если вы можете поместить первый файл в памяти, то я бы с чем-то вроде этого, используя AWK:

awk -F, 'NR == FNR { a[$1]; next } $2 in a { print $3 }' file1 file2 

Это сохраняет первое поле из первого файла в массиве a, затем печатает третье поле из второго файла, когда соответствует соответствующее второе поле.

+0

Спасибо Том. На самом деле я рассматривал awk как вариант, однако 1-й файл составляет около 100 МБ, а второй - 300 МБ. Я не думаю, что это возможно! – AOp0p

+0

Похоже, вам нужно около 100 МБ ОЗУ в этом случае, что не является необоснованной суммой. –

+0

Правильно, но я получил выходной файл с нулевым байтом. Кстати, я использую linux в виртуальной машине, однако назначенная RAM составляет 2 ГБ! – AOp0p

0

альтернативное решение с join, файлы нужно сортировать по объединенному полю.

$ join -t, -1 1 -2 2 file1 <(sort -t, -k2n file2) | cut -d, -f3 
Y 
X 
0

Ниже приведен вариант отличного ответа Тома Фенек (в отлично отчасти потому, что не требуется рода), но с тем преимуществом, что тест «NR == FNR» не требуется. Поэтому может быть обнаруживаемой быстрее:

awk -F, -v dict=FILE1 'BEGIN {while(getline<dict){a[$1]=1}} 
$2 in a {print $3}' 

Конечно, это также требует достаточно памяти для хранения хэш-таблицу для ФАЙЛА1, но, как уже отмечалось, это не должно быть проблемой, если ФАЙЛ1 только 100MB.

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