我有以下URL列表:
https://example.com/a?one=1&two=2
https://example.com/a?two=2&one=1
https://example.com/b?two=2&one=1
https://example.com/b?one=1&two=2
https://example.com/b?one=1
https://example.net/a/x?two=2&one=1
https://example.net/a/x?two=2&one=1
我想得到的结果:
https://example.com/a?one=1&two=2
https://example.com/b?one=1&two=2
https://example.com/b?one=1
https://example.net/a/x?two=2&one=1
问题是,下面的环节“雷同”;唯一的区别是参数的顺序:
https://example.com/a?one=1&two=2
https://example.com/a?two=2&one=1
https://example.com/b?two=2&one=1
https://example.com/b?one=1&two=2
是否可以通过考虑参数对URL进行排序?不确定这里应该采用哪种方法,也许有人已经有了解决方案;我只能假设使用awk可以实现。
2条答案
按热度按时间sg24os4d1#
解决方案TXR Lisp。
我将这两行添加到示例数据中,以显示它们根据URL参数首先按键排序的顺序进行排序。它们以朴素的词典顺序出现:
但是参数
a
被认为比b
更重要,所以a=aardvark
必须在a=tiger
之前排序。观察到:代码中的方法是将URL解析成片段并从中生成对象。在TXR Lisp中,有一个叫做“相等替换”的概念,通过这个概念,我们编程一个结构对象,让它在
equal
函数下使用一个替代键来表示它。我们通过编写一个名为equal
的单参数方法来实现这一点。该方法接受对象本身(“self”),并被调用以传递相等替换。在我们的例子中,我们有这样的:这句话的意思是:“为了比较我和其他东西的平等性,不要真的比较我,而是用我的
key
插槽代替我。我们使用规范化表示填充
url
结构的key
插槽:由域、路径和URL参数的排序关联列表组成的向量。使用相等替换,我们可以
uniq
URL对象,sort
它们,然后再次将它们打印为字符串。eyh26e7m2#
Perl一行程序:
URL(存储在文件
url-list
中)被Perl规范化后,sort -u
对列表进行排序并丢弃重复项。-l
- chomp the line-ending-p
-打印操作后的每行输入-E
-程序如下-在每一行输入上运行s|RE|CMD|e
-将RE
匹配的内容替换为执行CMD
的结果\?\K.*
- regex表示“文字?
之后的所有内容”。匹配存储在$&
中split RE, STRING
-在regex上拆分字符串($&
)(文字&
)sort LIST
-对碎片进行排序join SEPARATOR, LIST
-使用&
作为分隔符将它们再次连接起来可以用
gawk
完成,但可能会更长一点。POSIX
awk
不太支持排序。