![Namen, die in einem Datensatz am häufigsten vorkommen](https://rvso.com/image/38696/Namen%2C%20die%20in%20einem%20Datensatz%20am%20h%C3%A4ufigsten%20vorkommen.png)
users directory
----------------------
hjsyeh hellodir ;
awgshd newdir;
hjsyeh hidir;
jkdhjk welcomedir
Oben sind die Benutzersätze und die von ihnen erstellten Verzeichnisse angegeben. Wie kann ich die Summe der Benutzer ermitteln, wenn ich mehrere Verzeichnisse in einem Unix-Shell-Skript erstellt habe?
meine Ausgabe sollte sein
hjsyeh -2 directories
Antwort1
Sie können
echo "hjsyeh hellodir ; awgshd newdir; hjsyeh hidir; jkdhjk welcomedir" | \
sed -e "s/;\s*/\n/g" | awk '{print $1 }' | sort | uniq -c
Die Ausgabe lautet:
1 awgshd
2 hjsyeh
1 jkdhjk
BEARBEITEN:
Ausgabe im gewünschten Format durch erneuten Aufruf von 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 }'
Ausgabe:
awgshd -1 directories
hjsyeh -2 directories
jkdhjk -1 directories
Antwort2
Eine perl
Lösung:
$ 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
Diese Lösung funktioniert gut, wenn Ihre Daten klein sind. Bei größeren Dateien sollten Sie einige in Perl integrierte Funktionen verwenden , each
um den Hash zu durchlaufen: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