도메인(무작위 순서이지만 중복 도메인이 없고 하위 도메인 수가 제한 없음)이 포함된 대용량 파일(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.net
및 5.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
설명하다:
sort
파일을 반전하고 중복된 줄을 제거합니다. 이 단계에서는 "1"의 도메인/하위 도메인을 가장 짧은 이전 도메인/하위 도메인과 그룹화합니다.- 이
awk
부분에서는 다음 항목이 동일한 유형인지 확인합니다(변수에 정규식으로 저장됨dom_regex
). 그렇지 않은 경우 행을 인쇄하고 새 행을 설정합니다dom_regex
. 그렇지 않으면 해당 줄을 건너뜁니다. - 파일을 다시 뒤집어 보세요.
답변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