2015-07-30 4 views
4

у меня есть эти два файлаAWK: Сравнение двух различных столбцов в двух файлах

FILE1:

9 8 6 8 5 2 
2 1 7 0 6 1 
3 2 3 4 4 6 

File2: (который имеет более 4 миллионов строк)

MN 1 0 
JK 2 0 
AL 3 90 
CA 4 83 
MK 5 54 
HI 6 490 

Я хочу сравнить поле 6 файла1 и сравнить поле 2 файла 2. Если они совпадают, тогда поместите поле 3 файла2 в конец файла1 Я просмотрел другие решения, но я не могу заставить его работать правильно.

Желаемый результат:

9 8 6 8 5 2 0 
2 1 7 0 6 1 0 
3 2 3 4 4 6 490 

Моя попытка:

awk 'NR==FNR{a[$2]=$2;next}a[$6]{print $0,a[$6]}' file2 file1 

программа просто зависает после этого.

+0

Ваша попытка не «висеть» для меня. Хотя он не дает желаемого ответа, он подходит к завершению. – John1024

+0

Как долго вы работаете над файлом?Кроме того, на основе ввода примера выглядит, что 'file2' сортируется по полю 2, так ли это? – Arkku

ответ

4

Чтобы напечатать все строки в file1 с матча, если таковые имеются:

$ awk 'FNR==NR{a[$2]=$3;next;} {print $0,a[$6];}' file2 file1 
9 8 6 8 5 2 0 
2 1 7 0 6 1 0 
3 2 3 4 4 6 490 

Чтобы напечатать только те строки, которые имеют матч:

$ awk 'NR==FNR{a[$2]=$3;next} $6 in a {print $0,a[$6]}' file2 file1 
9 8 6 8 5 2 0 
2 1 7 0 6 1 0 
3 2 3 4 4 6 490 

Обратите внимание, что я заменил a[$2]=$2 с a[$2]=$3 и изменил тест a[$6] (что неверно, если значение равно нулю) до $6 in a.

+1

Подумайте, почему это было опущено - он производит желаемый результат с минимальными изменениями кода OP. – Arkku

+0

Работы. Upvoted. – slayedbylucifer

1

Ваша собственная попытка в основном имеет две ошибки, как показано на @ ответ John1024 в:

  1. Вы можете использовать поле 2, как и ключ и значение в a, где вы должны быть хранящей поле 3 в качестве значения (так как вы хотите сохранить его на потом), то есть он должен быть a[$2] = $3.
  2. Тест a[$6] является ложным, если значение в a равно нулю, даже если оно существует. Правильный тест - $6 in a.

Следовательно:

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

Тем не менее, может быть лучше всего подходит, но это не ясно из ваших спецификаций. Например, вы говорите, что file2 имеет более 4 миллионов строк, но неизвестно, есть ли у многих значения для поля 2. Если да, то a также будет иметь столько записей в памяти. И вы не указываете, сколько времени стоит file1, или если его заказ должен быть сохранен для вывода или если каждая строка (даже без совпадений в file2) должна выводиться.

Если это так, что file1 имеет много меньше строк, чем file2 имеет уникальные значения для поля 2, и только соответствующие линии должны быть выведены, и порядок не должен быть сохранен, то вы, возможно, захотите прочитать file1 первый ...

+0

Hi Arkku. Поля file2 уникальны. Это цифры от 1 до 4 миллионов. Все строки в файле1 будут отображаться на выходе, потому что всегда будет совпадение. – adrotter

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