Uma maneira de fazer isso:
cut -d: -f5 /etc/passwd | \
sed 's/\..*//' | \
sort -i | \
uniq -ci | \
sort -rn
Meu /etc/passwd
tem uma lista de usuários em um formato semelhante a este:
username:password:uid:gid:firstname.lastname, somenumber:/...
Objetivo: quero ver apenas os primeiros nomes e, em seguida, classificá-los com o nome mais comum em primeiro lugar, o segundo mais comum aparece em 2º, etc ....
Eu vi algumas soluções como como fazer a segunda parte, embora sejam relevantes para trabalhar com um arquivo de texto e não para ler de um mapa.
Em relação à primeira parte, eu realmente não sei como abordar isso. Eu sei que existem algumas soluções, mas não sei como fazê-las.
Usando o awk e a classificação para ter o nome mais comum primeiro:
awk -F: '{sub(/[.].*/, "", $5); a[$5]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr
Para uma versão sem distinção entre maiúsculas e minúsculas:
awk -F: '{sub(/[. ,].*/, "", $5); a[tolower($5)]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr
Para aqueles que preferem seus comandos espalhados por várias linhas:
awk -F: '
{
sub(/[.].*/, "", $5)
a[$5]++
}
END{
for (n in a)
print a[n],n
}
' /etc/passwd | sort -nr
-F:
Isso torna :
o separador de campos.
sub(/[.].*/, "", $5)
Isso remove tudo após o primeiro período do campo 5.
a[$5]++
A contagem do número de vezes que este nome apareceu é armazenada no array associativo a
. Isso incrementa o contador. Para a versão sem distinção entre maiúsculas e minúsculas, isso é substituído por a[tolower($5)]++
.
END{for (n in a)print a[n],n}
Isso imprime a contagem e o nome de todos os resultados que temos no array a
.
sort -nr
Isso classifica a saída numericamente em ordem decrescente.
Tags grep text-processing sort