Bash
如何刪除包含 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 循環搜尋域名,然後使用嵌套的 for 循環來檢查使用 uniq 的參數。但是我不知道該怎麼做。
有什麼想法我該怎麼做?
編輯: 我已將所有 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
像這樣的小 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