Как улучшить скорость этого скрипта awk - PullRequest
1 голос
/ 01 апреля 2020

У меня есть большой файл, скажем file1.log, который выглядит следующим образом:

1322 a@gmail.com
2411 b@yahoo.com

и файл меньшего размера, скажем file2.log, который выглядит следующим образом:

a@gmail.com
c@yahoo.com

Фактически, file1.log содержит около 6500000 строк, а file2.log содержит около 140000.

Я хочу найти все строки в file2.log, которые не отображаются в file1.log. Я написал эту команду awk:

awk 'NR==FNR{c[$2]++} NR!=FNR && c[$1]==0 {print $0}' file1.log file2.log > result.log'

через полчаса или около того я обнаружил, что команда все еще выполняется, и less result.log показывает, что result.log пусто. Мне интересно, могу ли я что-то сделать, чтобы сделать работу быстрее?

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Если вы сортируете файлы, вы можете использовать comm для печати только тех строк, которые присутствуют во втором файле с:

comm -13 <(awk '{ print $2 }' file1.log | sort) <(sort file2.log)
1 голос
/ 01 апреля 2020

Ха sh меньший файл file2 в памяти. Помните Дао программирования , 1,3 : Как это могло быть иначе? :

$ awk '
NR==FNR {           # hash file2 since its smaller
    a[$0]
    next
}
($2 in a) {         # if file1 entry found in hash
    delete a[$2]    # remove it
}
END {               # in the end
    for(i in a)     # print the ones that remain in the hash
        print i
}' file2 file1      # mind the order

Вывод:

c@yahoo.com
0 голосов
/ 01 апреля 2020

Я считаю, что самый простой - это просто grep -пайплайн

grep -Fwof file2 file1 | grep -Fwovf - file2

, вы также можете просто извлечь второй столбец file1 и снова использовать последнюю часть вышеприведенной команды:

awk '{print $2}' file1 | grep -Fwovf - file2

Или все в одном awk:

awk '(NR==FNR){a[$2]; next}!($1 in a)' file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...