awk - пропустить строки поддоменов, если домен уже соответствует - PullRequest
0 голосов
/ 01 октября 2018

Давайте предположим, что есть уже упорядоченный список доменов, например:

tld.aa.
tld.aa.do.notshowup.0
tld.aa.do.notshowup.0.1
tld.aa.do.notshowup.0.1.1
tld.aa.do.notshowup.too
tld.bb.showup
tld.aaaaa.showup
tld.xxxxx.
tld.xxxxx.donotshowup
tld.yougettheidea.dontyou
tld.yougettheidea.dontyou.thankyou

, который позже действует как черный список.

По конкретному требованию - все строки с завершающим символом '.'указать, что все более глубокие субдомены этого конкретного домена не должны появляться в самом черном списке ... так что желаемый результат приведенного выше примера будет / должен быть:

tld.aa.
tld.bb.showup
tld.aaaaa.showup
tld.xxxxx.
tld.yougettheidea.dontyou
tld.yougettheidea.dontyou.thankyou

В настоящее время я запускаю это в цикле (чистый bash + интенсивное использование встроенных встроенных команд bash для ускорения работы) ... но по мере роста списка требуется довольно много времени для обработки около 562 тыс. записей.

Разве это не должно быть легко для AWK (или, возможно, sed)чтобы сделать это - любая помощь очень ценится (я уже пробовал некоторые вещи в awk, но почему-то не смог отобразить то, что я хочу ...).

Спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

Если строки . всегда идут перед игнорируемыми строками, этот awk должен выполнить:

$ awk '{for (i in a) if (index($0,i) == 1) next}/\.$/{a[$0]=1}1' file
tld.aa.
tld.bb.showup
tld.aaaaa.showup
tld.xxxxx.
tld.yougettheidea.dontyou
tld.yougettheidea.dontyou.thankyou
  • /\.$/{a[$0]=1} добавляет строки с конечной точкой в ​​массив.
  • {for (i in a) if (index($0,i) == 1) next} ищет текущую строку в одной из этих проиндексированных записей и пропускает дальнейшую обработку, если найдена (next).

Если файл отсортирован в алфавитном порядке и ни один поддомен не заканчивается точкойвам даже не нужен массив, как подсказывает @Corentin Limier:

awk 'a{if (index($0,a) == 1) next}/\.$/{a=$0}1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...