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

Есть ли более эффективный способ удаления строк с недопустимым/слишком длинным tld (домен верхнего уровня)? Я не эффективен с 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

person Seaner992    schedule 04.09.2020    source источник
comment
Разве вы не должны использовать общедоступный список суффиксов вместо того, чтобы просто пытаться ограничить его длину?   -  person Shardj    schedule 04.09.2020
comment
При публикации примера ввода/вывода не публикуйте 1 строку под заголовком с надписью Keep и отдельную строку под заголовком с надписью Remove — упростите нам понимание и тестирование, а просто публикуйте один блок строк ввода и один файл ожидаемых выходных строк с учетом этого ввода. Я обновил ваш вопрос, чтобы показать, что я имею в виду.   -  person Ed Morton    schedule 04.09.2020
comment
Примеры, которые вы привели с xn-- в качестве префикса, НЕ являются недействительными TLD. Это ИДИ. Что бы вы ни делали, не ставьте ограничений по длине меток, в этом нет смысла.   -  person Patrick Mevzek    schedule 05.09.2020
comment
@Mevzek - Какой лучший способ удалить недействительные TLD из списка - более 1 миллиона строк?   -  person Seaner992    schedule 06.09.2020


Ответы (2)


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

$ 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
person karakfa    schedule 04.09.2020

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

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

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

sed -Ei '/\.[^.]{25,}$/d' file
person Ed Morton    schedule 04.09.2020
comment
Я починил это. Забегая вперед, если/когда вы будете задавать новые вопросы, не забудьте включить образец ввода/вывода в свой вопрос, чтобы у нас было что протестировать. - person Ed Morton; 04.09.2020