passwdファイルで最も一般的な名前を見つける方法

passwdファイルで最も一般的な名前を見つける方法

私の/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

    これにより、出力は数値の降順でソートされます。

関連情報