다음 형식의 URL 목록이 포함된 파일이 있습니다.
편집하다
http://www.google.com/absd/siidfs/kfd837382$%^$&,
www.google.com,
구글 사이트
yahoo.com/list/page/jhfjkshdjf…
다음 출력을 표시하는 스크립트를 작성하고 싶습니다.
google.com : 2
http://www.google.com: 1
yahoo.com : 1
파일에서 URL을 읽어서 전체 파일을 다시 확인해야 하는 부분에서 막혔습니다. 저는 bash 스크립팅을 처음 접해서 무엇을 해야할지 모르겠습니다.
답변1
원본 입력 파일
입력 형식이 다음과 같다고 가정합니다.
http://www.google.com,
www.google.com,
google.com
yahoo.com
결과는 다음과 같습니다.
google.com : 3
yahoo.com : 1
현재 처해 있는 전체 상황을 정확히 파악하기는 어렵지만 표시된 출력을 고려할 때 먼저 모든 줄이 다음 형식이 되도록 입력 파일을 변환하고 싶습니다.
google.com
google.com
google.com
yahoo.com
그런 다음 다음 명령 세트를 통해 파일을 실행하십시오.
$ grep -v "^$" data.txt | \
sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
sort | uniq -c
3 google.com
1 yahoo.com
다음과 같이 원하는 형식과 일치하도록 출력 형식을 정리할 수 있습니다.
$ grep -v "^$" data.txt | \
sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
sort | uniq -c | \
awk '{printf "%s : %s\n", $1, $2}'
google.com : 3
yahoo.com : 1
편집 #1
OP에는 후속 질문이 있으며 예에서 입력을 변경했습니다. 따라서 이러한 입력을 계산하려면 다음을 수행하십시오.
http://www.google.com/absd/siidfs/kfd837382$%^$&,
www.google.com,
google.com
yahoo.com/list/page/jhfjkshdjf...
첫 번째 예에서 수정된 한 줄의 코드를 사용할 수 있습니다.
$ grep -v "^$" data2.txt | \
sed -e 's/,$//' \
-e 's#\(http://[^/]\+\).*#\1#' \
-e '/^[^http]/ s/^www\.//' \
-e '/^[^http]/ s#\([^/]\+\).*$#\1#' | \
sort | uniq -c | \
awk '{printf "%s : %s\n", $1, $2}'
2 : google.com
1 : http://www.google.com
1 : yahoo.com
답변2
올바른 개수를 얻기 위해 sort
및 를 사용한 다음 최종 서식 지정을 위해 또는 을 사용할 수 있습니다 . 이 같은:uniq -c
sed
awk
sort file | uniq -c | awk '{printf "%s : %s\n", $1, $2}'
원래 질문은 동일한 기본 파이프라인으로 답변할 수 있지만 먼저 입력을 편집하세요.
sed -e 's/http:\/\///' -e 's/^www\.//' file | sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'
이것이 완전히 정확하지 않은 경우 호스트 이름 형식과 출력 형식이 정확하도록 sed
및 명령을 수정할 수 있습니다. awk
예를 들어 긴 URL의 오른쪽을 지우려면 다음을 수행하세요.
sed -e 's/http:\/\///' -e 's/^www\.//' -e 's/\/..*$//' file |
sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'