![在许多 URL 系列的长列表中,删除除最后一个出现之外的具有相同域的系列中的所有 URL](https://linux22.com/image/189293/%E5%9C%A8%E8%AE%B8%E5%A4%9A%20URL%20%E7%B3%BB%E5%88%97%E7%9A%84%E9%95%BF%E5%88%97%E8%A1%A8%E4%B8%AD%EF%BC%8C%E5%88%A0%E9%99%A4%E9%99%A4%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%87%BA%E7%8E%B0%E4%B9%8B%E5%A4%96%E7%9A%84%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E5%9F%9F%E7%9A%84%E7%B3%BB%E5%88%97%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%20URL.png)
我有一个我认为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,在排序后唯一。