Удаление строк с длинным TLD (домен верхнего уровня)

#linux #bash #awk #sed #domain-name

#linux #bash #awk #sed #доменное имя

Вопрос:

Есть ли более эффективный способ удаления строк с недопустимым / слишком длинным дву (домен верхнего уровня)? Я неэффективен с sed / awk. Я хочу удалить строки из файла, длина которых превышает 24 символа, после последнего периода.

То, что я написал, работает, но работает крайне медленно в длинных списках. Он берет каждую отдельную строку, подсчитывает количество символов после точки, сохраняет строки, содержащие более 24 символов, в список, затем удаляет их из источника.

Пример ввода:

 test.sub.xn--vermgensberatung-pwb
test.sub.xn--vermgensberatung-pwba
  

Ожидаемый результат:

 test.sub.xn--vermgensberatung-pwb
  

Мой текущий код:

 Source='/tmp/source'

while read -r Line || [[ -n "$Line" ]]; do
count="$(echo "$Line" | awk -F. '{ print $NF }' | awk '{ print length }')" #Count length after period
if [[ "$count" -gt '24' ]]; then echo "$Line" >> /tmp/filter; fi           #Save long TLD lines
done < "$Source"

#Remove results from source
cat /tmp/filter | sort > /tmp/filter.clean
comm -23 "$Source" /tmp/filter.clean > /tmp/clean
  

Комментарии:

1. Разве вы не должны использовать общедоступный список суффиксов вместо того, чтобы просто пытаться ограничить по длине?

2. При публикации примера ввода / вывода не размещайте 1 строку под заголовком с надписью Keep и отдельную строку под заголовком с надписью Remove — упростите нам понимание и тестирование, а просто разместите один блок входных строк и один файл ожидаемых выходных строк с учетом этого ввода. Я обновил ваш вопрос, чтобы показать, что я имею в виду.

3. Примеры, которые вы привели с xn-- в качестве префикса, НЕ являются недопустимыми TLD. Это IDN. Что бы вы ни делали, не устанавливайте ограничения длины для меток, это не имеет смысла.

4. @Mevzek — Каков наилучший метод удаления недействительных TLD из списка — более 1 миллионов строк?

Ответ №1:

Я думаю, вы чрезмерно усложняете сценарий

 $ cat file
www.cnn.com
this.is.notrightbutstillpass
this.will.fail.since.01234567890123456789012345
  

не уверен в фактических ограничениях TLD, но вы можете легко изменить код

 $ awk -F. 'length($NF)<24' file
www.cnn.com
this.is.notrightbutstillpass
  

Ответ №2:

Похоже, вы ищете:

 $ grep -Ev '.[^.]{25,}$' file
test.sub.xn--vermgensberatung-pwb
  

Чтобы обновить исходный файл без создания временного файла вручную, вы можете использовать GNU sed вместо grep:

 sed -Ei '/.[^.]{25,}$/d' file
  

Комментарии:

1. Я исправил это. В дальнейшем, если / когда вы задаете новые вопросы, пожалуйста, не забудьте включить в свой вопрос пример ввода / вывода, чтобы нам было с чем протестировать.