解決策がわからない問題があります。 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