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
それ以外の場合@MariusCuetのawkの答え。
答え4
GNUを使用して、datamash
元のデータのプレフィックスとして各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