首页 > 解决方案 > 根据部分文本删除重复行

问题描述

我有一长串存储在文本文件中的 URL,我将通过这些文件进行下载。但在此之前,我想从列表中删除重复的 URL。需要注意的一点是,一些 URL 看起来不同,但实际上指向的是同一页面。URL 中的唯一元素(除了域和路径)是查询字符串中的前 2 个参数。例如,我的文本文件如下所示:

https://www.example.com/page1.html?id=12345&key=dnks93jd&user=399494&group=23
https://www.example.com/page1.html?id=15645&key=fkldf032&user=250643&group=12
https://www.example.com/page1.html?id=26327&key=xkd9c03n&user=399494&group=15
https://www.example.com/page1.html?id=12345&key=dnks93jd&user=454665&group=12

如果在第二个查询字符串(键)之前定义了唯一 URL,则第 1 行和第 4 行是重复的。我想完全删除重复的行,所以甚至不保留一个。在上面的示例中,第 2 行和第 3 行将保留,而第 1 行和第 4 行将被删除。

如何使用基本的命令行工具来实现这一点?

标签: linuxbashunixtextcommand-line

解决方案


使用awk

$ awk -F'[?&]' 'FNR == NR { url[$1,$2,$3]++; next } url[$1,$2,$3] == 1' urls.txt urls.txt
https://www.example.com/page1.html?id=15645&key=fkldf032&user=250643&group=12
https://www.example.com/page1.html?id=26327&key=xkd9c03n&user=399494&group=15

读取文件两次;第一次记录你感兴趣的位出现了多少次,第二次只打印那些出现一次的位。


推荐阅读