1 votes

Ubuntu "sort -k<n> <filename>" ne fonctionne pas pour toutes les colonnes du fichier

Vue d'ensemble :

J'utilise "Ubuntu 18.04.1 LTS" sous Windows 10 téléchargé depuis :

  https://docs.microsoft.com/en-us/windows/wsl/install-manual

Lorsque j'essaie de "trier -k " où "-k" est -k[123456]", j'obtiens des résultats mitigés :

  • "-k[12]" : le tri fonctionne comme prévu

  • "-k[345]" : le tri ne se fait pas

  • "-k6 : le tri se produit sur la colonne 5 (vs colonne 6)

Si je mets en scène le même fichier fonctionnant sur un serveur RHEL 7.7 (Maipo) basé sur Cisco UCS, les six tris (" sort -k[123456] ") fonctionnent comme sur la colonne désignée.

Ai-je rencontré un bug dans Ubuntu ou les tris doivent-ils être exécutés différemment sur Ubuntu et sur RHEL ?

Échantillons triés :

LAPTOP-MOQUDB6E:/tmp $ lsb_release -d
Description:    Ubuntu 18.04.1 LTS

LAPTOP-MOQUDB6E:/tmp $ cat members          # {original file}
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands

LAPTOP-MOQUDB6E:/tmp $ sort -k2 members     # {"-k2": Colum_2 sort works as expected}
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz

LAPTOP-MOQUDB6E:/tmp $ sort -k5 members     # {"-k5": Col_5 sort doesn't work}
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz

LAPTOP-MOQUDB6E:/tmp $ sort -k6 members     # {"-k6": anomoly (sort occurs on Col_5)}
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz

0voto

steeldriver Points 118154

La différence est probablement liée à la locale par défaut des deux systèmes, et plus particulièrement au poids de collation des espaces blancs de tête.

Tout d'abord, il est important de noter que sort délimite sur un transition de l'état non vierge à l'état vierge par défaut - pas de blanc à non-blanc. Ainsi, lorsque vous avez un fichier en colonnes qui utilise plusieurs caractères d'espacement pour l'alignement, ces caractères d'alignement supplémentaires sont considérés comme faisant partie du champ suivant. Vous pouvez voir comment cela affecte vos résultats en ajoutant la balise --debug bandera.

[NOTE : Je vais utiliser la locale C ici, puisqu'elle présente le comportement que vous observez et que je ne sais pas quelle est votre locale réelle].

$ LC_COLLATE=C sort --debug -k5 file
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
                                   _____________________________________
________________________________________________________________________
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
                                      _____________________________________
___________________________________________________________________________
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
                                            ________________________________
____________________________________________________________________________
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
                                            ____________________________________
________________________________________________________________________________
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz
                                               _______________________
______________________________________________________________________

Ici, vous pouvez voir que ce qui se passe réellement est que es en triant sur la colonne 5, mais une fois que l'on prend en compte les espaces en tête, le résultat est qu'il trie dans l'ordre du plus au moins d'espaces en tête.

De même, lorsque vous utilisez -k6 il s'agit en fait de trier sur la 6ème colonne, ce qui, par coïncidence, donne le même ordre qu'un tri alphabétique sur la colonne 5 des régions géographiques (juste parce que A sia se trouve être courte et N orth_Amérique est longue)

$ LC_COLLATE=C sort --debug -k6 file
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
                                                     _______________________
____________________________________________________________________________
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
                                                       _________________________
________________________________________________________________________________
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
                                                       _________________
________________________________________________________________________
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
                                                              _____________
___________________________________________________________________________
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz
                                                              ________
______________________________________________________________________

La solution la plus simple est donnée dans la sortie de débogage :

sort: leading blanks are significant in key 1; consider also specifying 'b'

c'est-à-dire

$ LC_COLLATE=C sort --debug -b -k5 file
sort: using simple byte comparison
00017  Jasmine     <tbd>     Disney_Princess     Asia           Desert_Sands
                                                 ___________________________
____________________________________________________________________________
00013  Snow        White     Disney_Princess     Europe         Enchanted_Forest
                                                 _______________________________
________________________________________________________________________________
00018  Jiminy      Cricket   Disney              Europe         Tuscon0y
                                                 _______________________
________________________________________________________________________
00019  Speedy      Gonzales  Cats_Meow           North_America  Guadalajara
                                                 __________________________
___________________________________________________________________________
00016  Wiley       Coyote    Roadrunner_Nemesis  North_America  La_Paz
                                                 _____________________
______________________________________________________________________

0voto

Blue_Nunn Points 11

J'ai fait quelques recherches et j'ai observé que si le fichier à 6 colonnes n'a qu'un seul espace entre les champs sur chaque ligne, alors "sort -k# [fichier_source]" ("#" : 1-6) fonctionne à la fois sur Ubuntu et RHEL pour les tris effectués sur les colonnes 1-6. Il en va de même pour les tris effectués avec "sort -k#,# [fichier_source]" (ex : sort -k1,1 ..., sort -k2,2 ...... sort -k6,6 ...").

Si le fichier à six colonnes comporte plus d'un caractère [espace] entre les champs de chaque ligne (ex : le fichier a été aligné en utilisant "cat [fichier_source] | column -t > [fichier_cible]"), alors "sort -k# [fichier_cible]" ("#" : 1-6) ne fonctionne sur RHEL que pour les colonnes 1-6.

Pour Ubuntu, j'ai observé que "sort -k #[fichier_cible]" fonctionnait pour les colonnes 1 et 2, ne faisait rien pour les colonnes 3-5 et que "sort -k6 [fichier_cible]" finissait par trier sur la colonne 5.

Pour mon utilitaire, j'ai fini par préconditionner le fichier d'entrée du tri pour qu'il n'y ait qu'un seul espace entre les champs, puis j'ai retesté sur RHEL et Ubuntu pour m'assurer que j'obtenais les résultats souhaités. Merci à tous ceux qui ont jeté un œil à cette anomalie de tri entre les deux types d'OS.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X