스크립트(bash, awk 또는 이와 유사한)를 사용하여 파일에 있는 다른 도메인의 하위 도메인을 정리합니다.

스크립트(bash, awk 또는 이와 유사한)를 사용하여 파일에 있는 다른 도메인의 하위 도메인을 정리합니다.

도메인(무작위 순서이지만 중복 도메인이 없고 하위 도메인 수가 제한 없음)이 포함된 대용량 파일(1만 개 항목)이 있습니다. 다음은 작은 예입니다.

domain.com
domain.net
sub.domain.com
anotherdomain.com
a.b.c.d.e.domain.net
5.4.3.2.1.domain.org
4.3.2.1.domain.org

편집: 올바른 작업 세트는 다음에서 사용할 수 있습니다.http://p.ip.fi/WRD-(웹페이지가 느립니다. wget p.ip.fi/WRD-instant download를 사용하세요.)

모든 하위 도메인을 "정리"하고 싶습니다. 즉, 다른 도메인의 모든 하위 도메인을 삭제하는 새 파일을 작성하고 싶습니다. 예제에서는 다음과 같이 끝나야 합니다(주문에는 신경 쓰지 마세요).

domain.com
domain.net
anotherdomain.com
4.3.2.1.domain.org

sub.domain.com, a.b.c.d.e.domain.net5.4.3.2.1.domain.org은( domain.com, 및 domain.net의 하위 도메인 으로 4.3.2.1.domain.org) 제거되고 anotherdomain.com다른 도메인이므로 그대로 유지됩니다.

다양한 방법과 몇 가지 최적화를 시도했는데 작동하지만 파일에 1만 개의 항목이 있기 때문에 너무 느립니다(몇 시간). 유용하게 사용하려면 속도가 빨라야 합니다(최대 1분 정도). 이것이 내가 지금 가지고 있는 것입니다:

> $TEMP_BLACKLIST
BL=`cat $BLACKLIST`
for ZONE1 in $BL; do
        KEEP=1
        # sed -e "1,/^$ZONE1$/d" -> optimization: print $BLACKLIST only *after* the $ZONE1 occourence
        # break                  -> optimization: quit the loop if not present
        for ZONE2 in `echo $BL | sed -e "1,/^$ZONE1$/d"`; do
                if [[ $ZONE1 == *.$ZONE2 ]] ; then
                        KEEP=0
                        break
                fi
        done
        if [ $KEEP = 1 ] ; then
                echo $ZONE1 >> $TEMP_BLACKLIST
        fi
done
mv $TEMP_BLACKLIST $BLACKLIST

코드는 bash 스크립트 내에 포함되어야 하므로 bash를 실행하고 궁극적으로 해당 코드가 호출되는 공통 내장 스크립트 언어(awk, Perl 또는 기타)를 호출합니다(사용자 정의 C 코드 없음).

더 좋은 방법을 알고 있나요?

답변1

이 시도,

rev file \
| sort -u \
| tr '.' ',' \
| awk '$0!~dom_regex{print;dom_regex="^"$0"[.]";};NR==1{dom_regex="^"$0"[.]";print};' \
| tr ',' '.' \
| rev

산출:

4.3.2.1.domain.org
domain.com
anotherdomain.com
domain.net

설명하다:

  1. sort파일을 반전하고 중복된 줄을 제거합니다. 이 단계에서는 "1"의 도메인/하위 도메인을 가장 짧은 이전 도메인/하위 도메인과 그룹화합니다.
  2. awk부분에서는 다음 항목이 동일한 유형인지 확인합니다(변수에 정규식으로 저장됨 dom_regex). 그렇지 않은 경우 행을 인쇄하고 새 행을 설정합니다 dom_regex. 그렇지 않으면 해당 줄을 건너뜁니다.
  3. 파일을 다시 뒤집어 보세요.

답변2

이것은 다른 버전입니다

sed 's/^/\./' file |
    rev |
    LC_ALL=C sort -u |
    awk 'p == "" || substr($0,1,length(p)) != p { print $0; p = $0 }' |
    rev |
    sed 's/^\.//'

입력하다

domain.com
domain.net
sub.domain.com
anotherdomain.com
a.b.c.d.e.domain.net
5.4.3.2.1.domain.org
4.3.2.1.domain.org
b.c
a-b.c
b.b.c
btcapp.api.btc.com
btc.com

산출

a-b.c
b.c
4.3.2.1.domain.org
btc.com
domain.com
anotherdomain.com
domain.net

권장 데이터 세트를 사용해 보세요http://p.ip.fi/WRD-, 내가 수집한 소스 파일에는 59683줄이 포함되어 있고 필터링된 목록에는 34824줄이 있습니다. grep btc.com | wc -l필터링된 목록 에 36개의 행이 적용된 것을 볼 수 있습니다 .

답변3

도메인 확장자가 하나만 있는 경우 다음을 시도해 보세요.

awk -F '.' '!seen[$(NF-1)"."$NF]++' file

domain.com
domain.net
anotherdomain.com

관련 정보