В моем /etc/passwd
есть список пользователей в формате, который выглядит так:
username:password:uid:gid:firstname.lastname, somenumber:/...
Цель. Я хочу видеть только первые имена, а затем сортировать их с самым распространенным именем, первым, вторым наиболее часто встречающимся 2-м и т. Д ….
Я видел некоторые решения относительно того, как сделать вторую часть, хотя они имеют отношение к работе с текстовым файлом, а не к чтению с карты.
Что касается первой части, я действительно не знаю, как подойти к этому. Я знаю, что есть некоторые решения, но не знаю, как их сделать.
Один из способов сделать это:
cut -d: -f5 /etc/passwd | \ sed 's/\..*//' | \ sort -i | \ uniq -ci | \ sort -rn
Сначала используйте awk и сортировку, чтобы иметь наиболее распространенное имя:
awk -F: '{sub(/[.].*/, "", $5); a[$5]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr
Для нечувствительной к регистру версии:
awk -F: '{sub(/[. ,].*/, "", $5); a[tolower($5)]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr
Для тех, кто предпочитает их команды, распределенные по нескольким строкам:
awk -F: ' { sub(/[.].*/, "", $5) a[$5]++ } END{ for (n in a) print a[n],n } ' /etc/passwd | sort -nr
-F:
Это делает :
разделитель полей.
sub(/[.].*/, "", $5)
Это удаляет все после первого периода из поля 5.
a[$5]++
Счет количества раз, когда это имя появилось, хранится в ассоциативном массиве a
. Это увеличивает счетчик. Для версии без учета регистра это заменяется a[tolower($5)]++
.
END{for (n in a)print a[n],n}
Это печатает счетчик и имя для всех результатов, которые мы имеем в массиве a
.
sort -nr
Это сортирует результат численно в порядке убывания.