Intereting Posts
Как изменить строку состояния экрана GNU на основе имени хоста? Скорость чтения из смонтированного каталога Как изменить текстовый редактор по умолчанию в дистрибутиве Debian (сжатие) Добавить 'install selected .deb files' как команду в действиях Nautilus Мне нужно извлечь IP-адрес и путь к файлу из отчета Nessus, используя текстовый обработчик Как установить clang 3.9 или выше с помощью apt-get на Linux Mint? Понимание вывода lvdisplay в LVM / Linux Debian jessie, primus и 32-разрядные приложения Как работает встроенная структура управления / перенаправления Bash Обновление Strange nagios-nrpe-сервера от Jessie до Stretch Есть ли лучший способ, чем cp, копировать миллионы файлов при сохранении жестких ссылок? Как перечислить доступные алгоритмы ключа хоста для клиента SSH? Как заменить один цветовой код на другой в терминале? guestunmount: невозможно записать cd в каталог, но разрешения в порядке. проверить, что все точки монтирования установлены в соответствии с файлом fstab

Эффективный способ сравнения в awk

#!/bin/awk BEGIN { while(getline var < compareTo > 0) { orderIds[var]=var; } } { if(orderIds[$0] == "") { print $0; } } 

Работает как

 awk -v compareTo="ids.log.remote" -f sample.awk ids.log.local 

Это работает, но вместо использования ассоциативных массивов (например, HashMap) есть что-то вроде HashSet в awk?

Я получил тайминги

 bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.130s user 0m0.127s sys 0m0.002s bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.126s user 0m0.125s sys 0m0.000s bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.131s user 0m0.128s sys 0m0.002s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.053s user 0m0.051s sys 0m0.003s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.052s user 0m0.051s sys 0m0.001s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.053s user 0m0.051s sys 0m0.002s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.066s user 0m0.060s sys 0m0.006s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.065s user 0m0.058s sys 0m0.008s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.061s user 0m0.053s sys 0m0.007s 

@Dimitre Radoulov Похоже, ваш awk быстрее. Благодарю.

Я считаю, что это самый эффективный способ сделать это в awk:

 awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.remote ids.log.local 

Вы можете попробовать также с grep:

 grep -xFVf ids.log.remote ids.log.local