如何用Bash或Python去除文本文件中重复域名的URL
实现每个域名仅保留首个完整URL的方法
问题说明
输入URL列表(urls.txt):
https://www.google.com/1/ https://www.google.com/2/ https://www.google.com https://www.bing.com https://www.bing.com/2/ https://www.bing.com/3/
期望输出(每个域名仅保留首次出现的完整URL):
https://www.google.com/1/ https://www.bing.com
之前尝试的awk命令awk -F'/' '!a[$3]++' $file未达到预期,原因是当URL为根域名(无尾部/)时,分割后的字段逻辑和带路径的URL存在误判,导致同一域名出现多条输出。
Bash实现(awk优化版)
利用正则匹配提取完整域名作为唯一标识,只输出每个域名首次出现的完整URL:
awk '{ # 匹配从https://开始到第一个/结束的域名部分(无/则匹配到行尾) if (match($0, /https:\/\/[^\/]+/, domain_arr)) { domain = domain_arr[0] } # 仅当该域名未出现过时,输出当前URL并标记为已出现 if (!seen[domain]++) { print $0 } }' urls.txt
执行效果
运行后将直接输出期望的结果,自动过滤同一域名后续出现的所有URL。
Python实现
借助urllib.parse模块解析URL的域名部分,通过集合去重,保留每个域名的首个URL:
from urllib.parse import urlparse # 用于记录已处理过的域名 seen_domains = set() # 读取URL文件并处理 with open('urls.txt', 'r') as file: for line in file: url = line.strip() if not url: continue # 解析URL,提取域名部分 parsed_url = urlparse(url) domain = parsed_url.netloc # 域名未出现过时,输出并记录 if domain not in seen_domains: seen_domains.add(domain) print(url)
执行效果
运行脚本后,将按输入顺序输出每个域名首次出现的完整URL,完全符合需求。
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

