各ファイル名から最も高い番号のバージョンを選択するには?

各ファイル名から最も高い番号のバージョンを選択するには?

入力する:

ganglia-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm

出力は次のようになります。

ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.8.1-2.el7.x86_64.rpm

ls -vプレフィックスを取り、コマンドを使用してバージョンを取得するのと同じ方法を経ました...

ganglia
ganglia-debuginfo
ganglia-dlevel
ganglia-web
.....

そして使用ls -v prefix* | tail -n 1 ..

完璧なものを得ることができますが、神経節の接頭辞がなければ可能です。私は何も完璧に得ることができません。

ベストアンサー1

$ sed -E 's/([a-z])-([[:digit:]]+\.)+/\1 \2/' file |
  sort -k2Vr |
  awk '$1 in a{ next } { a[$1]; print $1 "-" $2 }'
ganglia-8.2-2.el7.x86_64.rpm
ganglia-debuginfo-8.2-2.el7.x86_64.rpm
ganglia-devel-8.2-2.el7.x86_64.rpm
ganglia-gmetad-8.2-2.el7.x86_64.rpm
ganglia-gmond-8.2-2.el7.x86_64.rpm
ganglia-gmond-python-8.2-2.el7.x86_64.rpm
ganglia-web-8.1-2.el7.x86_64.rpm
  • sed-: 名前とバージョンサフィックスの間の最初の文字を空白文字に置き換えます。
  • sort:2番目のフィールドでは、バージョンごとに逆順にソートします。
  • awk:名前が配列にある場合は行をスキップし、そうでない場合は配列に名前を保存し、名前とバージョンの-サフィックスを印刷します。

おすすめ記事