私の/etc/passwd
ユーザーリストの形式は次のとおりです。
username:password:uid:gid:firstname.lastname, somenumber:/...
ターゲット:名前を確認してから、最も一般的な名前が最初に表示され、2番目に一般的な名前が2番目に表示されるようにソートしたいと思います。
私も見ました。解決策2番目の部分を実行する方法は、地図上で読むのではなく、テキストファイルの処理に関連していますが。
最初の部分では、実際に何をすべきかわかりませんでした。いくつかの解決策があることを知っていますが、どうすればよいかわかりません。
答え1
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
これにより、出力は数値の降順でソートされます。