일치하는 문자열 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

답변2

파일의 모든 줄에 대해 다음 Perl 코드를 사용할 수 있습니다.

perl -nle '($d,$p)=m{^(\S+?)/\S+/\??(\w+)=}; $a{"$d$p"}=$_ if "$d$p";
END {print $a{$_} for (keys %a)}' input

input은 데이터 파일이지만 이 Perl 명령을 파이프할 수 있습니다. 작업은 간단합니다. 정규식은 먼저 도메인을 분리하고첫 번째각 항목에 대한 매개변수입니다. 그런 다음 전체 행이 사전에 기록되며, 여기서 초기에 격리된 부분이 키가 됩니다. 이전 값은 덮어쓰여집니다. 마지막으로 해시 값을 인쇄합니다.

다음과 같은 출력이 생성됩니다.

test.co.uk/car/interior=chair
www.example.com/1/1/?l=spanish
example.com/car/?wheel=rim
www.example.com/1/1/?selectedTab=live&selectedStream=1
example.co.uk/car/interior=chair
test.com/food/?fruit=banana

다음에서 입력하세요.

example.com/car/?wheel=tyre
example.com/car/?wheel=rim
test.com/food/?fruit=apple
test.com/food/?fruit=banana
test.co.uk/car/interior=chair
example.co.uk/car/interior=chair
www.example.com/1/1/?l=thai 
www.example.com/1/1/?l=thai
www.example.com/1/1/?l=ukrainian
www.example.com/1/1/?l=turkish
www.example.com/1/1/?selectedTab=live&selectedStream=1
www.example.com/1/1/?l=ukrainian
www.example.com/1/1/?l=turkish
www.example.com/store/?l=turkish
www.example.com/1/1/storecommon.js?v=aHpFwmVHuavD&l=dutch
www.example.com/1/1/2/0/?l=english
www.example.com/1/1/9/0/?l=english
www.example.com/1/1/?l=spanish

?v=aHpFwmVHuavD&l=dutch두 개의 매개변수로 구성된 오류가 있습니다 . 아마도 하나씩 분해하여 처리해야 하므로 상황이 더 복잡해집니다.그렇지 않은지 확인하십시오.또한 다음 domain.com과 같은 점에 유의하세요 www.domain.com.아니요실제로는 동일합니다.

관련 정보