部分的に重複した行の検索と削除

部分的に重複した行の検索と削除
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改行文字の間にファイル名を合わせます。この場合、それを削除して出力せずにスペースを変更しません。/\1d
  • この時点で、私たちは新しい単語を見つけたことを知っているので、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

関連情報