![データセット内で最も多く出現する名前](https://rvso.com/image/38696/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E5%86%85%E3%81%A7%E6%9C%80%E3%82%82%E5%A4%9A%E3%81%8F%E5%87%BA%E7%8F%BE%E3%81%99%E3%82%8B%E5%90%8D%E5%89%8D.png)
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