删除具有长 TLD(顶级域)的行
Remove lines with long TLD (Top Level Domain)
是否有更有效的方法来删除具有无效/太长的 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
听起来您正在寻找:
$ grep -Ev '\.[^.]{25,}$' file
test.sub.xn--vermgensberatung-pwb
要在不手动创建临时文件的情况下更新原始文件,您可以使用 GNU sed 而不是 grep:
sed -Ei '/\.[^.]{25,}$/d' file
我猜你over-complicate剧本
$ 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
是否有更有效的方法来删除具有无效/太长的 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
听起来您正在寻找:
$ grep -Ev '\.[^.]{25,}$' file
test.sub.xn--vermgensberatung-pwb
要在不手动创建临时文件的情况下更新原始文件,您可以使用 GNU sed 而不是 grep:
sed -Ei '/\.[^.]{25,}$/d' file
我猜你over-complicate剧本
$ 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