파일에 포함된 문자열이 얼마나 자주 나타나는지 어떻게 알 수 있나요?

파일에 포함된 문자열이 얼마나 자주 나타나는지 어떻게 알 수 있나요?

다음 형식의 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 -csedawk

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}'

관련 정보