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

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

入力する:

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:名前が配列にある場合は行をスキップし、そうでない場合は配列に名前を保存し、名前とバージョンの-サフィックスを印刷します。

答え2

以下は、パッケージのメジャーバージョンとマイナーバージョンに基づいてソートするのに役立ちます。役に立つアイデアです。

$ cat test | sed -e 's/-\([[:alpha:]]\)/+\1/g' |   sort -t - -n -k2 -r | sed -e 's/+\([[:alpha:]]\)/-\1/g'
ganglia-web-3.8.1-2.el7.x86_64.rpm
ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm
ganglia-gmond-3.8.2-2.el7.x86_64.rpm
ganglia-gmetad-3.8.2-2.el7.x86_64.rpm
ganglia-devel-3.8.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm
ganglia-3.8.2-2.el7.x86_64.rpm
ganglia-web-3.7.1-2.el7.x86_64.rpm
ganglia-gmond-python-3.7.2-2.el7.x86_64.rpm
ganglia-gmond-3.7.2-2.el7.x86_64.rpm
ganglia-gmetad-3.7.2-2.el7.x86_64.rpm
ganglia-devel-3.7.2-2.el7.x86_64.rpm
ganglia-debuginfo-3.7.2-2.el7.x86_64.rpm
ganglia-3.7.2-2.el7.x86_64.rpm

答え3

そしてzsh

typeset -A max_version
for file (*.rpm(nN)) max_version[${file%-*-*.*.*.*}]=$file
print -rC1 -- $max_version

現在のディレクトリのファイルのリストは*.rpm(nN)数字でソートされます。.rpm連想配列にパッケージの最大バージョン(in)を記録します。xx-version-packageVersion.rel.arch.rpmmax_version

連想配列には以下が含まれます。

$ typeset -p max_version typeset -A max_version=( [ganglia]=ganglia-3.8.2-2.el7.x86_64.rpm [ganglia-debuginfo]=ganglia-debuginfo-3.8.2-2.el7.x86_64.rpm [ganglia-devel]=ganglia-devel-3.8.2-2.el7.x86_64.rpm [ganglia-gmetad]=ganglia-gmetad-3.8.2-2.el7.x86_64.rpm [ganglia-gmond]=ganglia-gmond-3.8.2-2.el7.x86_64.rpm [ganglia-gmond-python]=ganglia-gmond-python-3.8.2-2.el7.x86_64.rpm [ganglia-web]=ganglia-web-3.8.1-2.el7.x86_64.rpm )

関連情報