查找并删除部分重复的行

查找并删除部分重复的行
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain2.com/dl/G5SPNDOF/JHCGTS/AAA-1080p.mp4.html
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

给定一个包含以上几行的文件,如何删除具有重复文件但总体链接不同的文件,最终得到:

https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html

答案1

使用 awk :

awk -F'/' '!seen[$NF]++' file

您也可以使用排序来完成此操作。由于您的文件包含许多发生更改的字段,因此您需要首先反转它:

rev file | sort -u -t/ -k1,1 | rev

答案2

使用 any sed,您可以选择惰性的“将所有已知文件名放入保留空间”方法:

sed 'G;\_/\(.*\)\n.*\1_d;P;s_.*/__;h;d' file
  • G将保留空间(具有所有已知的文件名)附加到模式空间
  • 该模式/\(.*\)\n.*\1适合 和 换行符之间的文件名,该换行符在收集的文件名中/重复 ( ) ;\1在这种情况下,d删除它,没有输出,保持空间没有变化
  • 此时,我们知道我们找到了一个新单词,因此P打印该行而不添加保留空间
  • s_.*/__删除路径,因此新的路径列表可以复制到h旧空间。d抑制进一步的输出

答案3

如果您的列表很大,那么要避免将内存中的所有文件名存储在 awk 中:

$ sort file | awk -F'/' '$NF != prev{print} {prev=$NF}'
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html

否则请参阅@MariusCouet 的 awk 答案

答案4

使用 GNUdatamash在每个 URL 中添加基本名称(末尾的文件名)作为原始数据的前缀,然后按添加的列对数据进行分组,并从每个组中提取第一个 URL。然后在cut管道末尾删除添加的字段。这让人想起一个人可能会如何做施瓦茨变换

$ datamash basename 1 cut 1 <file | datamash groupby 1 first 2 | cut -f 2
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html

您可以改为获取最后的每个组的 URL:

$ datamash basename 1 cut 1 <file | datamash -s groupby 1 last 2 | cut -f 2
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

...或随机一个:

$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain2.com/dl/G5SPNDOF/JHCGTS/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain.com/files/G5SPNDOF/AAA-1080p.mp4.html
https://www.domain.com/files/SVSRS0AD/BBB-1080p.mp4.html
$ datamash basename 1 cut 1 <file | datamash -s groupby 1 rand 2 | cut -f 2
https://www.domain.com/files/ZQWL80BG/AAA-1080p.mp4.html
https://www.domain.com/files/UCIONEMA/BBB-1080p.mp4.html

相关内容