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