Bugos a sort parancs?

 ( locsemege | 2015. június 26., péntek - 1:11 )

A version sort szerintem nem igazán jó.

Nézzük az alábbi file-t:


cat sortbug.txt
NetworkManager-1.0.0-3.fc22
NetworkManager-0.9.10.0-11.git20140704.fc22
NetworkManager-1.0.2-1.fc22
NetworkManager-1.0.4-0.1.git20150618.8cffaf3bf5.fc22
NetworkManager-0.9.10.0-13.git20140704.fc22
NetworkManager-0.9.10.0-10.git20140704.fc22
NetworkManager-1.0.0-7.fc22
NetworkManager-1.0.4-0.1.git20160624.f245b49a.fc22
NetworkManager-1.0.0-1.fc22
NetworkManager-0.9.10.0-8.git20140704.fc22
NetworkManager-0.9.10.0-6.git20140704.fc22
NetworkManager-0.9.10.0-14.git20140704.fc22
NetworkManager-1.0.0-9.fc22
NetworkManager-1.0.0-4.fc22
NetworkManager-1.0.0-8.fc22
NetworkManager-1.0.0-6.fc22
NetworkManager-1.0.0-5.fc22
NetworkManager-0.9.10.0-12.git20140704.fc22

Rendezzük sorba:

sort -rV sortbug.txt
NetworkManager-1.0.4-0.1.git20150618.8cffaf3bf5.fc22
NetworkManager-1.0.4-0.1.git20160624.f245b49a.fc22
NetworkManager-1.0.2-1.fc22
NetworkManager-1.0.0-9.fc22
NetworkManager-1.0.0-8.fc22
NetworkManager-1.0.0-7.fc22
NetworkManager-1.0.0-6.fc22
NetworkManager-1.0.0-5.fc22
NetworkManager-1.0.0-4.fc22
NetworkManager-1.0.0-3.fc22
NetworkManager-1.0.0-1.fc22
NetworkManager-0.9.10.0-14.git20140704.fc22
NetworkManager-0.9.10.0-13.git20140704.fc22
NetworkManager-0.9.10.0-12.git20140704.fc22
NetworkManager-0.9.10.0-11.git20140704.fc22
NetworkManager-0.9.10.0-10.git20140704.fc22
NetworkManager-0.9.10.0-8.git20140704.fc22
NetworkManager-0.9.10.0-6.git20140704.fc22

Most azt tegyük félre, hogy a Fedora csomagkészítői megoldották az időutazást, de ettől különösképpen fel kellene cserélődnie az első két sornak szerintem. Ugyan nem tudom, a version sort hogyan működik, de a kötőjel, a pont, stb. egyfajta helyiérték kijelölő kellene legyen. Ha az első két sort nézem, a második bizony újabb, mint az első. A többit jól csinálja. Jut eszembe, coreutils verzió:

rpm -qf `which sort`
coreutils-8.23-10.fc22.x86_64

Ugye, érdemes bugreportot küldeni? (Már megtettem.)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

LC_ALL=C sort -rV sortbug.txt is ezt produkálja?

Igen, de azt ebben az esetben ignorálja.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem, mert nem hiba. man sort ;)

     -V, --version-sort
             Sort version numbers.  The input lines are treated as file names
             in form PREFIX VERSION SUFFIX, where SUFFIX matches the regular
             expression "(.([A-Za-z~][A-Za-z0-9~]*)?)*".  The files are
             compared by their prefixes and versions (leading zeros are
             ignored in version numbers, see example below).  If an input
             string does not match the pattern, then it is compared using the
             byte compare function.  All string comparisons are performed in C
             locale, the locale environment setting is ignored.

PREFIX es VERSION-re tud illeszteni, a tobbi pedig a SUFFIX reszbe esik, ami alapjan nem rendez.

Nem állítom, hogy világos. Mi a PREFIX, VERSION és SUFFIX definíciója itt? Mert mintha csak a SUFFIX-re adna egy regexp-et, de épp arra nem rendez. Szóval mi is a prefix, és a version most? Továbbá mi az értelme, ha ezen a konkrét példán elbukik? Valós scriptem kergült meg miatta, elkezdtem debugolni, aztán kiderült, hülyeséget ad vissza a sort. Volt újabb NetworkManager csomag a Koji build szerveren, mint a gépemen lévő változat, az erre tenyésztett scriptem pedig kiröhögött, és azt mondta, nincs újabb. Aztán kiderült, hazudik a sort.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Amit sortolgatsz, az nem felel meg a verziószámnak.

https://www.gnu.org/software/coreutils/manual/html_node/Details-about-version-sort.html

PREFIX = NetworkManager-
VERSION = 1

SUFFIX = .0.4

Ezt nem rendezi: -0.1.git20160624.f245b49a.fc22 - Ez nem csak az első két sorból derül ki.

Szerintem a VERSION az 1.0.4, amit te írtál az a major verzió. A suffix a kötőjel utáni rész lesz.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Amit itt leirtal, az amugy se egyezik meg nagyjabol senkinek a definiciojaval a verziot illetoen, legfeljebbb a CentOS/Fedora community definialja igy a verzioszamot. A verzioszam ugyanis egy egeszen konkret valami, ami a vilag ertelmesebbik felen igy nez ki: 1.0.4. Major, minor, build. That's all, nothing more.
--
Blog | @hron84
Üzemeltető macik

Azt értem, hogy így csinálja, de szerintem értelmesebb lenne úgy, hogy amennyiben a PREFIX és a VERSION egyezik, akkor nem random hagyja a fenébe a sorrendet, hanem SUFFIX alapján rendezzen.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

PREFIX VERSION SUFFIX
Példa:
NetworkManager- 1.0.0-3 .fc22
Így módosítva a txt-ben a sorokat szépen rendezi.

Különben az jutott még eszembe, hogy ha a SUFFIX szerint is rendezne, az kompatibilis lenne a jelenlegi változattal, hiszen elsősorban PREFIX, másodsorban VERSION, harmadsorban SUFFIX szerint rendezne. Most csak az első kettő szerint. Na jó, picit lassabb lenne, de legalább jó.

Ezt úgy értem, hogy azonos prefixen belül verzió szerint, azonos prefix és verzió esetén suffix szerint volna jó.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Többen kifejtették már, hogy a version az elég kötött formát igényel.

Azonban neked a "-h --human-numeric-sort" várhatóan megfelel.

Legalábbis az jól rendezi ezt a halamzt ;)

--
zrubi.hu