Как использовать AWK для запроса файла, загруженного с помощью mapfile

Я использую awk на Ubuntu для корреляции ссылок между двумя файлами журнала (In.log и Out.log). Он работает так, как ожидалось, но увеличил размер Out.log (~ K строк), увеличение времени обработки также! Поэтому мне было интересно, уменьшить доступ к диску, если я могу загрузить этот файл Out.log в память один раз перед циклом, используя команду MAPFILE или что-то подобное, но я не вижу полезных примеров. Какие-либо предложения?

IN.LOG:

2016-10-20 19:20:00,IN,DEU00000000159560100 2016-10-22 19:22:20,IN,DEU00000000159560511 2016-10-24 19:24:20,IN,DEU00000000159560382 2016-10-26 19:26:20,IN,DEU00000000159560609 2016-10-28 19:28:20,IN,DEU00000000159560809 

out.log:

 2016-10-20 19:20:30,OUT,DEU00000000159560100 2016-10-21 19:21:30,OUT,DEU00000000159560510 2016-10-22 19:22:30,OUT,DEU00000000159560511 2016-10-23 19:23:30,OUT,DEU00000000159560381 2016-10-24 19:24:30,OUT,DEU00000000159560382 2016-10-25 19:25:30,OUT,DEU00000000159560195 2016-10-26 19:26:30,OUT,DEU00000000159560609 2016-10-27 19:27:30,OUT,DEU00000000159560433 2016-10-28 19:28:30,OUT,DEU00000000159560809 2016-10-29 19:29:30,OUT,DEU00000000159560694 

Текущий скрипт:

 cat IN.LOG | while read -r Line do Reference=$(cut -f3 -d',' <<< $Line) TimeStampIn=$(cut -f1 -d',' <<< $Line) TimeStampOut=$(awk -F',' -v Ref=$Reference '$3==Ref {print $1; exit} ' OUT.LOG) echo "$Reference,$TimeStampIn,$TimeStampOut" done 

Только одна команда awk так:

 awk -v reflog=OUT.LOG ' BEGIN{ FS=OFS=","; while((getline <reflog) > 0) refs[$3]=$1; close(reflog) }{ print $3,$1,refs[$3] ? refs[$3] : "not found" }' IN.LOG 

Или используя join которое сделано именно для таких случаев:

 join -t, -j 3 -o 0,1.1,2.1 -a 1 -e "not found" \ <(sort -t, -k3 IN.LOG) <(sort -t, -k3 OUT.LOG) \ | sort -t, -k2 

Примечание. join требует отсортированных входных файлов (по столбцу «join»). Вот почему мы сортируем перед обоими журнальными файлами по эталонному столбцу, а потом сортируем результат снова по дате.

Оба метода ведут себя по-разному относительно неисторических ссылок в OUT.LOG. awk игнорирует дубликаты ссылок в OUT.LOG (последний выигрывает), но join будет печатать все совпадения. Более того, если вы добавите -a 2 в команду join тогда он напечатает все невоспроизводимые строки.