내 /etc/passwd
사용자 목록의 형식은 다음과 같습니다.
username:password:uid:gid:firstname.lastname, somenumber:/...
표적:이름을 확인한 다음 가장 일반적인 이름이 먼저 나타나고 두 번째로 흔한 이름이 두 번째로 나타나도록 정렬하고 싶습니다.
나도 좀 봤어해결책두 번째 부분을 수행하는 방법은 지도에서 읽는 것이 아니라 텍스트 파일 처리와 관련되어 있지만.
첫 번째 부분에서는 실제로 무엇을 해야 할지 몰랐습니다. 몇 가지 해결책이 있다는 것을 알고 있지만 어떻게 해야 할지 모르겠습니다.
답변1
한 가지 방법은 다음과 같습니다.
cut -d: -f5 /etc/passwd | \
sed 's/\..*//' | \
sort -i | \
uniq -ci | \
sort -rn
답변2
awk 및 sort를 사용하여 가장 일반적인 이름을 먼저 입력하세요.
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
그러면 출력이 숫자 내림차순으로 정렬됩니다.