我有一个我想不出如何解决的问题。我有一个目录,其中包含 1000 个文件,每个文件都包含一个带有 URL 参数的 URL:
文件 1:
example.com/car/?wheel=tyre
文件 2:
example.com/car/?wheel=rim
文件 3:
test.com/food/?fruit=apple
文件 4:
test.com/food/?fruit=banana
文件 5:
test.co.uk/car/interior=chair
文件 6:
example.co.uk/car/interior=chair
我想删除包含相同域名和参数但保留第一个的重复文件。参数内的项目,例如。轮胎、轮辋、苹果、香蕉和椅子应该被忽略。所以所需的输出如下:
文件 1:
example.com/car/?wheel=tyre
文件 3:
test.com/food/?fruit=apple
文件 5:
test.co.uk/car/interior=chair
文件 6:
example.co.uk/car/interior=chair
文件 2 已被删除,因为它与文件 1 的域名和 URL 参数名称相同。文件 4 已被删除,因为它与文件 3 的域名和 URL 参数名称相同。文件 5 和 6 被保留,因为它们使用不同的域,即使它们使用相同的 URL 参数。
我在想我需要先遍历目录中的所有文件:
FILES=data/urls/*
for i in $FILES
do
cat $i | *Check for matching domain, then matching parameter*
else
rm $i
fi
done
或者可能使用 for 循环搜索域名,然后使用嵌套的 for 循环来检查使用 uniq 的参数。但是我不知道该怎么做。
有什么想法我该怎么做?
编辑: 我已将所有 url 添加到一个文件中,以使它们更易于使用:
sed -i -e '$a\' *.txt
cat * > all.txt
编辑 2: 某些 URL 在路径中包含多个文件夹,例如。
www.example.com/1/2/3/4/5/?l=123
www.example.com/1/2/3/?1=AAA
像这样的小 Bash 脚本应该可以:
将所有行放在一个文件中,您可以使用以下 Perl 代码:
input
是数据文件,但您可以改为通过管道输入此 Perl 命令。工作很简单。正则表达式首先用于隔离域和每个条目的第一个参数。然后将整行写入字典,其中较早的孤立部分是关键。任何较早的值都会被覆盖。最后打印哈希。它产生这个输出:
从这个输入:
有一个故障
?v=aHpFwmVHuavD&l=dutch
,它由两个参数组成。它们可能应该被一一分解和处理,这使事情变得更加复杂。确保不是这种情况。另请注意,domain.com
和www.domain.com
实际上并不相同。