comm: le fichier n'est pas trié

9

J'avais l'habitude commde 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?

wenzi
la source
Dans mon cas, j'avais trié (croissant lexicographique) les fichiers à l'aide de notepad ++, qui considère les minuscules et les majuscules séparément, par exemple. un apparaîtra après «Z» en ordre croissant. Ceci est différent de la façon dont l'utilitaire de tri (bash) trie. Pour vérifier cela, j'ai converti toutes les lignes en majuscules, puis triées en np ++, comm ne s'est plus plaint.
Sahil Singh

Réponses:

10

commnécessite un tri lexicographique (simple sort) et non un tri numérique ( sort -n). Par exemple, il souhaite l'ordre suivant:

1
2000
300

Pas l'ordre suivant:

1
300
2000

Corrigez cela et le problème devrait disparaître. Pour les cas plus ésotériques où commles paramètres régionaux peuvent être différents des sortparamètres régionaux, vous pouvez exécuter sortet commavec LC_COLLATE=Cdans leur environnement pour utiliser l'ordre des octets natif.

Chris Down
la source
comment faire faire un tri numérique?
wenzi
4
@wenzisort -n
Gilles 'SO- arrête d'être méchant'
" Commande Lexographique " est l'endroit où une série de nombres AUGMENTE dans une série ordonnée - vous l'avez inversée dans votre réponse: mathworld.wolfram.com/LexicographicOrder.html . Veuillez vous référer aux résultats de test de ma réponse ci-dessous qui comparent l'utilisation de sort avec et sans le -ncommutateur et démontrent que seul avec le -ncommutateur, vous pouvez obtenir l' ordre croissant correct que vous reconnaissez être requis dans votre propre réponse.
F1Linux
@ F1Linux Quoi? commnécessite littéralement la commande LC_COLLATEd. 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.
Chris Down
@ChrisDown Votre réponse à laquelle j'ai répondu - pas celle que je vois que vous venez de modifier et ne mentionne MAINTENANT que " LC_COLLATE " était: "le comm veut un tri littérallexicographique, pas un tri numérique. Corrigez cela et le problème devrait disparaître. " Maintenant où il y avait quelque chose à propos de "LC_COLLATE" qui est une bête très différente du type "_Lexographic". En effet, votre réponse initiale était si clairsemée sur une seule ligne sans AUCUN EXEMPLE, c'est ce qui m'a incité à revoir la question avec ma propre réponse. Je vote pour votre réponse mise à jour, car "LC_COLLATE" est définitivement opérationnel ici, comme vous l'avez noté.
F1Linux
0

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 commpour 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 -ncommutateur avec la sortcommande utilisée pour trier les résultats fournis comm, l'ordre des résultats renvoyés par commpeut être très différent:

Lexographique : L'utilisation du -ncommutateur 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 du commcommutateur `s--nocheck-order

Ordre des octets : Il n'y a AUCUNE utilisation du -n switchavec sort. LC_COLLATEdétermine l'ordre qui peut même varier selon la façon dont le localeest défini sur l'hôte où la commande est exécutée. Il s'agit de l'entrée commattendue par défaut. Un peu plus LC_COLLATEpeut être trouvé ici: Reference1 et Reference2

L'erreur est-elle un problème? Cela dépend de ce que vous essayez de réaliser. Comme vousverrez dans les exemples cidessous,commrenvoie les mêmes résultats après avoir comparé les fichiers avec ou sans sort `-ncommutateur, bienleur commande varie de la manière cidessus selon que l'-n switchon utilise avec lasortcommande. 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 -ncommutateur lors du tri des données fournies à des commfins de comparaison.

ESSAI:

Nous comparerons les résultats de la commcommande avec et sans le -ncommutateur. 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 :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Intersection :

Répertorier uniquement les numéros communs aux DEUX fichiers

Sans -ninterrupteur:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Résultats : corrects, mais retournés dans un ordre non trié

AVEC -n interrupteur:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

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 commsans le -ncommutateur, mais dans une liste triée.

Différence :

Énumérez uniquement les numéros uniques à chaque fichier:

Sans -ninterrupteur:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

Résultats : correct - ces chiffres sont en effet exclusifs à chaque fichier respectif.

AVEC -n interrupteur:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

Résultats : corrects, mêmes résultats que commsans le -ncommutateur, 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-orderpour 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 par comm -nsont corrects, l'erreur peut être ignorée en toute sécurité en le supprimant:

Intersection :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Différence :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

CONCLUSION:

L'erreur «le fichier n'est pas dans l'ordre de tri » lorsque renvoyé le tri des entiers positifs alimentés commne signifie pas que les résultats renvoyés à l'aide du -ncommutateur avec commsont incorrects. En effet, l'utilisation comm -nrenvoie 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.

F1Linux
la source
La réponse la plus votée mentionne que "comm veut un tri lexicographique", mais vous semblez trier numériquement. Cela semble tomber dans certains cas.
2h56
Testez à nouveau avec des nombres qui trient différemment numériquement et lexicographiquement, tels que 1000, 200, 30, 4.
Kusalananda
@Kusalananda Je viens d'incorporer vos commentaires très aimables et utiles dans ma réponse mise à jour. Le plus obligé pour vos commentaires!
F1Linux
@dhag vient de mettre à jour ma réponse pour intégrer les vôtres et les commentaires de Kusalanada. Le plus obligé pour vous, les gens prenant le temps et l'effort de revoir ma
réponse
1
@JeffSchaller La réponse à laquelle j'ai d'abord répondu faisait mention du type "Lexographic", pas "LC_COLLATE" comme dans la réponse nouvellement modifiée de Chris. J'ai répondu à Chris que c'était correct et j'ai voté pour sa réponse mise à jour. "Lexographic" & "LC_COLLATE" sont des bêtes différentes. Merci Jeff-
F1Linux