Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/09/2007, à 14:35

Sorbus

ordre alphabétique avec sort [Résolu]

Comment faire pour qu'un fichier tabulé comme celui-ci :

(dans les exemples ci-dessous, "-->" symbolise une tabulation.

tuméfier --> acouchinà
tu vas bien? -->    a ti passi?
structurer --> structurà
structure --> structura

soit trié comme suit :

tu vas bien? -->    a ti passi?
tuméfier --> acouchinà
structure -->structura
structurer --> structurà

C'est à dire :
1°) pour qu'un espace soit pris en compte dans le tri alphabétique, et considéré comme premier dans l'ordre alphabétique avant tout autre caractère. (dans l'exemple "tu  "   avant "tum").
2°) pour que ne soit pris en compte pour le classement alphabétique que ce qui est situé avant une tabulation donc, "structure" avant "structurer" bien que "structure" soit suivi d'un "s" après la tabulation.

Pour l'instant, je n'arrive à rien avec

#!/bin/bash
sort -t \n $1 > $2

Est-ce que de bonnes options (et je ne vois pas lesquelles dans le manuel de "sort") pourraient permettre d'obtenir le résultat souhaité... ou bien faut-il utiliser autre chose que "sort" ?

Question pour résoudre un problème situé à la fin de cette discussion :
http://forum.ubuntu-fr.org/viewtopic.php?id=40622

Dernière modification par Sorbus (Le 11/09/2007, à 08:24)

Hors ligne

#2 Le 10/09/2007, à 18:01

Compte anonymisé

Re : ordre alphabétique avec sort [Résolu]

Salut

Je ne sais pas si j'ai bien compris mais qq chose comme ceci pourrait faire l'affaire. Le fichier en entrée s'appelle "entree" et celui de sortie "sortie" (c'est original).

awk -F \t '{ printf "%s\t%s\n",  $2,$1 }' entree | sort -t \t | awk -F \t '{ printf "%s\t%s\n",$2,$1 }' >sortie

Je pense qu'il y a + simple.

@+

Dernière modification par Compte anonymisé (Le 10/09/2007, à 18:01)

#3 Le 10/09/2007, à 18:40

Sorbus

Re : ordre alphabétique avec sort [Résolu]

J'ai testé, ça donne ça en sortie :

ruc    s
    ruc    s
    uméfier --> acouchinà   
    u vas bien? -->    a

Hors ligne

#4 Le 10/09/2007, à 19:43

Sorbus

Re : ordre alphabétique avec sort [Résolu]

@jeanjd63,
J'ai fait un truc que m'a suggéré best_friend dans l'autre fil indiqué ci-dessus : remplacement des tabulations par un caractère situé en premier dans l'ordre alphabétique, puis tri avec sort, et remplacement du caractère ajouté par les tabulations avec sed.

Ce qui me donne :
#!/bin/bash

TEMP=`mktemp`
> $2
cat $1 | sed 's/\t/00000/g' > $TEMP
mv $TEMP $2
cat $2 | sort -t \n > $TEMP
mv $TEMP $2
cat $2 | sed 's/00000/\t/g' > $TEMP
mv $TEMP $2

J'ai mis 00000, car je ne risque pas d'avoir une suite de cinq zéros ailleurs dans un dictionnaire, ni en principe de mot se terminant par zéro... et que je ne sais pas quel est le premier caractère de l'ordre alphabétique trié par "sort".

Cette solution marche, mais sans doute pas très élégante. J'aimerais donc comprendre la tienne jeanjd63, pour pouvoir l'améliorer...

Hors ligne

#5 Le 10/09/2007, à 19:55

JoelS

Re : ordre alphabétique avec sort [Résolu]

Et

sort --key=1 --field-separator=\t --reverse ./test.txt

ça marche pas ? (le --reverse c'est bien parceque ton exemple est en sens inverse).

Hors ligne

#6 Le 10/09/2007, à 20:00

Compte anonymisé

Re : ordre alphabétique avec sort [Résolu]

Salut

J'avais fait ça sur un mac os x (linux aussi). Je te renvoie la ligne corrigée.

awk -F \\t '{ printf "%s\t%s\n",  $2,$1 }' entree | sort -t \t | awk -F \\t '{ printf "%s\t%s\n",$2,$1 }' >sortie

PS pour explication :
awk -F \\t '{ printf "%s\t%s\n",  $2,$1 }' entree cette ligne restructure les champs de chaque ligne de ton fichier :
tuméfier         acouchinà      devient
acouchinà         tuméfier     etc...

le -F \\t indique que le caractère de séparation est la tabulation.

sort trie ton fichier

awk -F \\t '{ printf "%s\t%s\n",$2,$1 }' >sortie  remet dans l'ordre initial et le copie dans le fichier sortie.

Simplement il y a un petit pb avec les "blancs" en début de ligne. La ligne qui apparait en second devrait être en premier. A améliorer.

@+

Dernière modification par Compte anonymisé (Le 10/09/2007, à 20:09)

#7 Le 10/09/2007, à 22:31

Sorbus

Re : ordre alphabétique avec sort [Résolu]

Oula ! Ouben roll
Je ne comprenais pas vos réponses... mais j'ai honte en relisant mon premier post.

Bon... je ne l'édite pas. Mais je réécris correctement ma question...
... et désolé de vous avoir fait chercher midi à quatorze heure.

Le résultat auquel je veux aboutir est celui-ci :

structure -->structura
structurer --> structurà
tuméfier --> acouchinà
tu vas bien? -->    a ti passi?

C'est à dire simplement l'ordre alphabétique correct sur le premier champ.

La commande "sort" met "structurer" avant "structure"... car elle lit la suite de la ligne après la tabulation et elle trouve un "s" (début de "structurà") à la suite de "structure".

... d'où la solution de mon post 4, qui marche (mais il y a certainement plus simple).

@JoelS
ta proposition, sans "--reverse", produit en sortie ce que me donne "sort -t \n $1 > $2", c'est à dire "structurer" avant "structure".

@jeanjd63
vraiment confus de l'incohérence de mon premier post hmm mais tes explications m'ont permis d'apprendre un peu de awk.

Dernière modification par Sorbus (Le 11/09/2007, à 06:37)

Hors ligne

#8 Le 11/09/2007, à 06:11

Compte anonymisé

Re : ordre alphabétique avec sort [Résolu]

Salut

Tu peux tester simplement avec la partie sort :
sort -t \t   entree > sortie  où -t \t indique que le séparateur est une tabulation


@+

Dernière modification par Compte anonymisé (Le 11/09/2007, à 06:12)

#9 Le 11/09/2007, à 07:54

Sorbus

Re : ordre alphabétique avec sort [Résolu]

Bonjour,

J'avais déjà essayé  sort -t \t
en pensant que ça ferait ce que tu dis... mais test fait : non... "sort" continue à lire la ligne au-delà de la tabulation malgré le "-t \t"...

J'avais regardé le manuel de "sort"... et pour "-t", j'ai d'ailleurs du mal à comprendre :
 

-t, --field-separator=SÉPARATEUR
              utiliser le SÉPARATEUR à la place  d’une  transition  d’un  caractère non blanc vers un caractère blanc

... "à la place d'une transition d'un caractère non blanc vers un caractère blanc" = ???

Dernière modification par Sorbus (Le 11/09/2007, à 07:55)

Hors ligne

#10 Le 11/09/2007, à 08:10

Compte anonymisé

Re : ordre alphabétique avec sort [Résolu]

D'après ce que j'avais compris, le -t défini un séparateur. \t = tabulation dans ce cas.
J'avoue avoir refait le test sur OS X (mac). Mais j'essaierai dès que possible sur Ubuntu.
Par curiosité que te "sort" (c'est le cas de le dire) la commande donnée?

De toutes façons sort continue le tri au delà des séparateurs. Simplement il ne les prends pas en compte pour le tri mais tous les champs sont triés. Si tu souhaites qu'il s'arrête sur le premier champ, il faut le définir et,si j'ai encore bien compris, il faut préciser une taille et tes champs ont une longueur variable.


@+

Dernière modification par Compte anonymisé (Le 11/09/2007, à 08:14)

#11 Le 11/09/2007, à 08:24

Sorbus

Re : ordre alphabétique avec sort [Résolu]

sort me sort ceci :

structurer    structurà
structure    structura
tuméfier    acouchinà
tu vas bien?    a ti passi?

En effet, mon premier champ est variable. La solution est donc sans doute bien celle de mon post 4. Je note comme résolu... mais si des idées nouvelles sont apportées par la suite sur le sujet, je garde un oeil.

@+

Hors ligne