많은 URL 시리즈의 긴 목록에서 동일한 도메인을 가진 시리즈의 마지막 URL을 제외한 모든 항목을 제거합니다.

많은 URL 시리즈의 긴 목록에서 동일한 도메인을 가진 시리즈의 마지막 URL을 제외한 모든 항목을 제거합니다.

완벽할 것 같은 질문이 있는데 sed제대로 사용하는 방법을 알아낼 만큼 지식이 부족합니다.

이것이 제가 가지고 있는 것입니다 - 이와 비슷하지만 더 긴 파일입니다:

https://www.npmjs.com
https://www.npmjs.com/package/rabin
https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

필요한 것은 굵게 표시된 항목뿐입니다. 즉, 도메인 이름을 공유하는 일련의 URL이 있고 전체 텍스트 파일을 나타내려면 각 시리즈의 마지막 URL이 필요합니다.

그러니 앞에 화살표가 있는 사람만

https://www.npmjs.com
->https://www.npmjs.com/package/rabin
->https://www.politico.com/news/magazine/blah/blah
https://www.raspberrypi.org
https://www.raspberrypi.org/documentation/blah
->https://www.raspberrypi.org/products/raspberry-pi-zero-w/
https://www.reddit.com
https://www.reddit.com/
https://www.reddit.com/r/geology/blah/blah/blah
->https://www.reddit.com/r/commandline/blah/blah/blah
...thousands more...

어떤 아이디어가 있나요?

감사합니다!

답변1

이렇게 하면 됩니다:

cat input.txt | \
gawk -e '{match($0, /(https?:\/\/(?:www.)?[a-zA-Z0-9-]+?[a-z0-9.]+)/, url)} \
!a[url[1]]++{ \
    b[++count]=url[1] \
} \
{ \
    c[url[1]]=$0 \
} \
END{ \
    for(i=1;i<=count;i++){ \
        print c[b[i]] \
    } \
}' > output.txt

정규식은 아마도 많이 단순화될 수 있고 도메인 이름의 더 많은 변형을 포착할 수 있지만 제 경우에는 잘 작동합니다. 이 awk명령은 다음에서 수정되었습니다.이것답변. (흥미롭게도 누군가 내 질문에서 "bash" 태그를 제거한 반면, 나에게 정말 도움이 되었던 답변은 "bash" 태그가 붙어 있었습니다...

이것에 대해 더 생각해 보면, 일치하는 도메인을 끝에 별도의 "필드"로 추가하기 위해 질문을 사용하고, 고유 정렬을 사용하여 마지막 도메인을 선택한 다음 끝에 도메인 "필드"를 제거하거나, 오히려 다음을 사용할 수도 있다고 생각합니다. Ask는 정렬 후 고유한 원래 URL인 첫 번째 "필드"만 인쇄합니다.

관련 정보