데이터 세트에서 가장 자주 나타나는 이름

데이터 세트에서 가장 자주 나타나는 이름
users     directory
----------------------
hjsyeh    hellodir ;
awgshd    newdir;
hjsyeh    hidir;
jkdhjk    welcomedir

위에는 사용자 집합과 이들이 생성하는 디렉터리가 나와 있습니다. Unix 쉘 스크립트에서 생성된 더 많은 수의 디렉토리를 가진 사용자의 합계를 얻는 방법은 무엇입니까?

내 출력은

hjsyeh -2 directories

답변1

당신은 그것을 사용할 수 있습니다

echo "hjsyeh hellodir ; awgshd newdir; hjsyeh hidir; jkdhjk welcomedir" | \
 sed -e "s/;\s*/\n/g" | awk '{print $1 }' | sort | uniq -c 

출력은 다음과 같습니다.

  1 awgshd
  2 hjsyeh
  1 jkdhjk

편집하다: 다른 호출을 통해 요청된 형식으로 출력 awk:

echo "hjsyeh hellodir ; awgshd newdir; hjsyeh hidir; jkdhjk welcomedir" |                                                                
  sed -e "s/;\s*/\n/g" | awk '{print $1 }' | sort | uniq -c | 
  awk '{ printf "%s -%s directories\n" , $2 , $1  }'

산출:

awgshd -1 directories
hjsyeh -2 directories
jkdhjk -1 directories

답변2

일방 perl통행:

$ perl -anle '
    $h{$F[0]}++;
    END {
        $key_max = (sort { $h{$b} <=> $h{$a} } keys %h)[0];
        print "$key_max - $h{$key_max} directories";
    }
' file
hjsyeh - 2 directories

이 솔루션은 데이터가 작은 경우 매우 효과적입니다. 더 큰 파일의 경우 Perl 내장 기능 중 일부를 사용하여 each해시 를 반복 해야 keys합니다 .values

$ perl -anle '
    $h{$F[0]}++;
    END {
        while (($k,$v) = each %h) {
          if ($v > $max_val) {
              $max_key = $k;
              $max_val = $v;
          }
      }
      print "$max_key - $max_val directories";
    }
' file
hjsyeh - 2 directories

관련 정보