根据部分文本删除重复行
Remove duplicate lines based on partial text
我有一长串 URL 存储在文本文件中,我将浏览并下载这些文件。但在执行此操作之前,我想从列表中删除重复的 URLs。需要注意的一件事是,有些 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 行将被删除。
如何使用基本命令行工具实现此目的?
使用awk
:
$ awk -F'[?&]' 'FNR == NR { url[,,]++; next } url[,,] == 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
读取文件两次;第一次计算您感兴趣的位出现了多少次,第二次只打印出现一次的位。
要缩短其他答案的代码:
awk -F\& 'FNR == NR { url[,]++; next } url[,] == 1' urls.txt urls.txt
我有一长串 URL 存储在文本文件中,我将浏览并下载这些文件。但在执行此操作之前,我想从列表中删除重复的 URLs。需要注意的一件事是,有些 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 行将被删除。
如何使用基本命令行工具实现此目的?
使用awk
:
$ awk -F'[?&]' 'FNR == NR { url[,,]++; next } url[,,] == 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
读取文件两次;第一次计算您感兴趣的位出现了多少次,第二次只打印出现一次的位。
要缩短其他答案的代码:
awk -F\& 'FNR == NR { url[,]++; next } url[,] == 1' urls.txt urls.txt