Bash

如何刪除包含 2 個匹配字元串但保留其餘的重複文件?

  • January 20, 2019

我有一個我想不出如何解決的問題。我有一個目錄,其中包含 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

引用自:https://unix.stackexchange.com/questions/495630