データセットで最も頻繁に表示される名前

データセットで最も頻繁に表示される名前
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

関連情報