在许多 URL 系列的长列表中,删除除最后一个出现之外的具有相同域的系列中的所有 URL

在许多 URL 系列的长列表中,删除除最后一个出现之外的具有相同域的系列中的所有 URL

我有一个我认为sed可能很完美的问题,但我对此了解不够,无法弄清楚如何正确使用它。

这就是我所拥有的 - 一个像这样的文件,但更长:

https://www.npmjs.com
https://www.npmjs.com/package/rabin
https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

我需要的只是粗体的项目,即有许多系列的 URL 共享一个域名,并且我需要每个系列中的最后一个 URL 来表示整个文本文件。

所以只有那些前面有箭头的

https://www.npmjs.com
->https://www.npmjs.com/package/rabin
->https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
->https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
->https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

有任何想法吗?

谢谢你!

答案1

这做到了这一点:

cat input.txt | \
gawk -e '{match($0, /(https?:\/\/(?:www.)?[a-zA-Z0-9-]+?[a-z0-9.]+)/, url)} \
!a[url[1]]++{ \
    b[++count]=url[1] \
} \
{ \
    c[url[1]]=$0 \
} \
END{ \
    for(i=1;i<=count;i++){ \
        print c[b[i]] \
    } \
}' > output.txt

正则表达式可能可以简化很多,也许可以捕捉域名的更多变化,但就我的情况而言,它工作得很好。该awk命令修改自回答。 (有趣的是,有人从我的问题中删除了“bash”标签,而真正帮助我的答案却被标记为“bash”......

更多地思考这个问题,我想你也可以使用ask将匹配的域作为单独的“字段”添加到末尾,使用sort unique选择最后一个,然后删除末尾的域“字段”,或者更确切地说使用ask 只打印第一个“字段”,即原始URL,在排序后唯一。

相关内容