【问题标题】:Remove lines with long TLD (Top Level Domain)删除具有长 TLD(顶级域)的行
【发布时间】:2020-09-04 15:38:52
【问题描述】:

是否有更有效的方法来删除包含无效/过长 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

【问题讨论】:

  • 您不应该使用公共后缀列表而不是仅仅尝试按长度限制吗?
  • 发布示例输入/输出时,不要在 Keep 标题下发布 1 行,在 Remove 标题下单独发布一行 - 让我们更容易理解和测试并只发布一个输入行块和一个给定输入的预期输出行文件。我更新了你的问题以表明我的意思。
  • 您提供的以xn-- 为前缀的示例不是无效的顶级域名。它们是 IDN。无论你做什么,都不要对标签进行长度限制,这是没有意义的。
  • @Mevzek - 从列表中删除无效 TLD 的最佳方法是什么 - 超过 100 万行?

标签: linux bash awk sed domain-name


【解决方案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
    

    【讨论】:

    • 我修好了。如果/当您提出新问题时,请记住在您的问题中包含示例输入/输出,以便我们进行测试。
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2015-04-30
    • 2015-07-03
    • 2019-07-25
    • 2016-12-10
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多