J'avais l'habitude comm
de comparer deux fichiers triés. Chaque ligne de ces fichiers est un nombre entier positif. Mais les résultats montrent
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
Comment se fait-il l'erreur même si ces deux fichiers sont triés?
sort
comm
numeric-data
wenzi
la source
la source
Réponses:
comm
nécessite un tri lexicographique (simplesort
) et non un tri numérique (sort -n
). Par exemple, il souhaite l'ordre suivant:Pas l'ordre suivant:
Corrigez cela et le problème devrait disparaître. Pour les cas plus ésotériques où
comm
les paramètres régionaux peuvent être différents dessort
paramètres régionaux, vous pouvez exécutersort
etcomm
avecLC_COLLATE=C
dans leur environnement pour utiliser l'ordre des octets natif.la source
sort -n
sort
avec et sans le-n
commutateur et démontrent que seul avec le-n
commutateur, vous pouvez obtenir l' ordre croissant correct que vous reconnaissez être requis dans votre propre réponse.comm
nécessite littéralement la commandeLC_COLLATE
d. Qu'il suffise de dire que les erreurs dans votre réponse ne sont pas purement cosmétiques pour des exemples en dehors de votre ensemble de test ... personne n'a demandé de tri numérique positif.RÉPONSE MISE À JOUR:
PROBLÈME:
L'OP reçoit une erreur sur "le fichier n'est pas dans l'ordre de tri " lors de l'utilisation
comm
pour comparer des entiers positifs dans les fichiers, pas du texte. Nous avons donc affaire à des nombres non décimaux.Réponse courte:
En fonction de l'utilisation du
-n
commutateur avec lasort
commande utilisée pour trier les résultats fourniscomm
, l'ordre des résultats renvoyés parcomm
peut être très différent:Lexographique : L'utilisation du
-n
commutateur avec tri entraînera le classement des "nombres entiers positifs" en une série de nombres croissants. L '" erreur " peut être supprimée à l'aide ducomm
commutateur `s--nocheck-order
Ordre des octets : Il n'y a AUCUNE utilisation du
-n switch
avecsort
.LC_COLLATE
détermine l'ordre qui peut même varier selon la façon dont lelocale
est défini sur l'hôte où la commande est exécutée. Il s'agit de l'entréecomm
attendue par défaut. Un peu plusLC_COLLATE
peut être trouvé ici: Reference1 et Reference2L'erreur est-elle un problème? Cela dépend de ce que vous essayez de réaliser. Comme vousverrez dans les exemples cidessous,
comm
renvoie les mêmes résultats après avoir comparé les fichiers avec ou sanssort
`-n
commutateur, bienleur commande varie de la manière cidessus selon que l'-n switch
on utilise avec lasort
commande. Moi-même, je préfère les résultats ordonnés "lexographiques" - des nombres qui augmentent en série.Cependant, si vous ne souhaitez pas que les résultats soient classés par ordre " lexographique ", n'utilisez PAS le
-n
commutateur lors du tri des données fournies à descomm
fins de comparaison.ESSAI:
Nous comparerons les résultats de la
comm
commande avec et sans le-n
commutateur. J'ai augmenté la complexité de mon ensemble de données de test d'échantillons à la demande de Kusalananda:Données de test :
file1.txt :
file2.txt :
Intersection :
Répertorier uniquement les numéros communs aux DEUX fichiers
Sans
-n
interrupteur:Résultats : corrects, mais retournés dans un ordre non trié
AVEC
-n
interrupteur:Résultats : corrects, mais retournés dans un ordre trié LEXOGRAPHIQUE . L'opération s'est terminée avec succès et a renvoyé les mêmes résultats que l'utilisation
comm
sans le-n
commutateur, mais dans une liste triée.Différence :
Énumérez uniquement les numéros uniques à chaque fichier:
Sans
-n
interrupteur:Résultats : correct - ces chiffres sont en effet exclusifs à chaque fichier respectif.
AVEC
-n
interrupteur:Résultats : corrects, mêmes résultats que
comm
sans le-n
commutateur, mais renvoie l'erreur sur l'ordre des entiers positifs non triés dans les fichiers eux-mêmes.SOLUTION pour des RÉSULTATS LEXOGRAPHIQUES:
Utilisez le commutateur
comm
`s--nocheck-order
pour supprimer le message d'erreur. Comme nous savons que les nombres ne sont pas triés dans chaque fichier mais que les résultats renvoyés parcomm -n
sont corrects, l'erreur peut être ignorée en toute sécurité en le supprimant:Intersection :
Différence :
CONCLUSION:
L'erreur «le fichier n'est pas dans l'ordre de tri » lorsque renvoyé le tri des entiers positifs alimentés
comm
ne signifie pas que les résultats renvoyés à l'aide du-n
commutateur aveccomm
sont incorrects. En effet, l'utilisationcomm -n
renvoie un bon ordre dans un ordre trié!Merci à @dhag, @kusalananda @ChrisDown pour avoir soulevé les problèmes qui nécessitaient une expansion supplémentaire. Toujours heureux de voir mon travail révisé: la seule façon de s'améliorer, c'est d'être constamment poussés et mis au défi par nos pairs.
la source