一致する2つの文字列を含む重複ファイルを削除し、残りを保持する方法は?

一致する2つの文字列を含む重複ファイルを削除し、残りを保持する方法は?

解決策がわからない問題があります。 1000個のファイルを含むディレクトリがあり、各ファイルにはURLパラメータを持つURLが含まれています。

ファイル1:

example.com/car/?wheel=tyre

ファイル2:

example.com/car/?wheel=rim

ファイル3:

test.com/food/?fruit=apple

ファイル4:

test.com/food/?fruit=banana

ファイル5:

test.co.uk/car/interior=chair

ファイル6:

example.co.uk/car/interior=chair

同じドメイン名とパラメータを含む重複ファイルを削除し、最初のファイルを維持したいと思います。パラメーター内の項目。タイヤ、ボーダー、リンゴ、バナナ、椅子は無視する必要があります。したがって、希望の出力は次のようになります。

ファイル1:

example.com/car/?wheel=tyre

ファイル3:

test.com/food/?fruit=apple

ファイル5:

test.co.uk/car/interior=chair

ファイル6:

example.co.uk/car/interior=chair

ファイル2は、ファイル1とドメイン名とURLパラメータ名が同じで削除されました。ファイル4は、ファイル3とドメイン名とURLパラメータ名が同じで削除されました。ファイル5と6は、同じURLパラメータを使用しても別のドメインを使用するため保持されます。

まず、ディレクトリ内のすべてのファイルを繰り返す必要があると思います。

FILES=data/urls/*
for i in $FILES
do
  cat $i | *Check for matching domain, then matching parameter*
else
 rm $i
fi
done

または、forループを使用してドメイン名を取得し、uniqネストされたforループを使用してパラメータを解決することもできます。しかし、どうすればいいのかわかりません。

これを行う方法についてのアイデアはありますか?

編集する: 簡単に作業できるように、すべてのURLをファイルに追加しました。

sed -i -e '$a\' *.txt
cat * > all.txt

編集2: たとえば、一部のURLにはパスに複数のフォルダがあります。

www.example.com/1/2/3/4/5/?l=123
www.example.com/1/2/3/?1=AAA

ベストアンサー1

このような小さなBashスクリプトはトリックを実行する必要があります。

#!/bin/bash

declare -A a                             # declare associative array 
for i in *; do                           # loop through files in directory

  read -r url < "$i"                     # read the url from the file
  domain=${url%%/*}                      # delete longest match from back
  param=${url##*/}                       # delete longest match from start
  param=${param%%=*}                     # delete "=value" from param
  k=$domain$param                        # construct key

  if [[ -n $k && -z ${a[$k]} ]]; then    # check its prior use as key k
    a[$k]=1                              # new key: mark it as such
  else                                   # known/faulty key: delete the file
    echo Delete "$i"                     # Replace with: rm "$i" if satisfied
  fi
done

おすすめ記事