Bonjour, sauriez-vous comment effectuer un tri croissant et/ou décroissant d'une liste de mots dans un fichier texte ?
J'ai fait quelques recherches, mais j'ai rien réussi à faire en ce sens avec sort , à part supprimer les doublons.
Je me suis rabattu sur la solution de facilité: Textpad par Wine. Mais j'aimerai bien pouvoir le faire avec un éditeur de texte libre graphique ou via ligne de commande.
Peux-tu fournir un exemple pratique ?
Comme un fichier d'entrée et ce même fichier trié comme tu l'entends, que l'on puisse avoir une idée des données manipulées par exemple.
Il me semblais que sort pouvait trier des mots, mais je n'ai pas vraiment tester. Sinon ça doit être possible de bricoler un petit script shell qui répond à ton besoin !
Y a des caractères spéciaux, des lettres minuscules comme majuscules et des chiffres, donc je suppose que ça rend le processus un peu plus difficile.
Je suis au travail je n'ai pas le document à dispo, mais dans l'idée ça donne ça:
Document brut:
1ffezfUfev@!!!!!7
KjfeiK544!@_fff
Lokzi78
OIK!aze
!Gf@
mf!
JK
lOkP78Gg#EE
AE89fv
@ZE1
Document trié:
JK
mf!
!Gf@
@ZE1
AE89fv
Lokzi78
OIK!aze
lOkP78Gg#EE
KjfeiK544!@_fff
1ffezfUfev@!!!!!7
Donc un tri basé uniquement sur le nombre de caractères.
si deux mots ont la meme taille.comment les tries tu? quel est la taille des fichiers que tu veux trier?
Ok, en effet ici sort
ne peut pas être utilisé directement car il essaye de trier selon la "valeur" des mots et je n'ai pas trouvé d'option pour qu'il prenne en compte la longueur.
Néanmoins j'ai trouvé des solutions qui permettent d'utiliser sort
pour ce problème, en rajoutant devant chaque mot son nombre de caractères. Il suffit alors de trier avec sort
qui va ici marcher puis d'enlever le nombre de caractère une fois que l'on en a plus besoin.
C'est ce qui est proposé par exemple ici : https://stackoverflow.com/questions/8296649/sorting-lines-from-longest-to-shortest?lq=1
Et ça se fait en une ligne :awk '{ print length($0) " " $0; }' <tonFichier> | sort -r -n | cut -d ' ' -f 2-
Tu peux même rajouter l'option de sort
permettant d'éliminer les doublons.
Reste à voir les performances sur de gros fichiers, selon le volume de données à traiter ce n'est pas forcément la méthode la plus optimale. Mais sur de petits fichiers cela marche plutôt bien !
Le 26 février 2019 à 15:20:37 godrik a écrit :
si deux mots ont la meme taille.comment les tries tu? quel est la taille des fichiers que tu veux trier?
Mon but est de pouvoir supprimer toutes les lignes ayant moins de 4 caractères.
Une taille d'environ 5 Mo,voir une dizaine de Mo grand maximum.
@Athuro83
Merci pour l'astuce, j'essaierai ce soir après le travail, je vous tiendrais au courant
[15:29] /tmp % cat foo
1ffezfUfev@!!!!!7
KjfeiK544!@_fff
Lokzi78
OIK!aze
!Gf@
mf!
JK
lOkP78Gg#EE
AE89fv
@ZE1
[15:29] /tmp % awk '{l=length($1); if (l < 10) { print "0" l " " $1 } else { print l " " $1 }}' foo | sort | awk '{print $2}'
JK
mf!
!Gf@
@ZE1
AE89fv
Lokzi78
OIK!aze
lOkP78Gg#EE
KjfeiK544!@_fff
1ffezfUfev@!!!!!7
C'est bourrin mais ça marche.
[Edit] ah, ça a posté entre temps…
Si tu fais ca tres souvent, une meilleur solution est bucket sort. Mais probablement il faudrait ecrire ca; et ca ne vaut pas le coup, si ton tri est rare.
Il y a un plugin gedit pour trier il me semble. Si tu ne le trouves pas c'est que j'ai confondu et c'est un plugin pluma.
(pseudo banni d'où le retard de ma réponse)
Tri effectué avec la solution proposée par Athuro83, c'est parfait
Le 26 février 2019 à 17:22:16 _ZawaZawaZawa_ a écrit :
Il y a un plugin gedit pour trier il me semble. Si tu ne le trouves pas c'est que j'ai confondu et c'est un plugin pluma.
Effectivement il existe, à voir si ça marche (rien ne vaut gedit, sérieusement) :
https://help.gnome.org/users/gedit/stable/gedit-plugins-sort.html.en
Et je plussoie la référence à Cross of Iron
Le 04 mars 2019 à 09:49:20 Raskolnik a écrit :
Le 26 février 2019 à 17:22:16 _ZawaZawaZawa_ a écrit :
Il y a un plugin gedit pour trier il me semble. Si tu ne le trouves pas c'est que j'ai confondu et c'est un plugin pluma.Effectivement il existe, à voir si ça marche (rien ne vaut gedit, sérieusement) :
https://help.gnome.org/users/gedit/stable/gedit-plugins-sort.html.enEt je plussoie la référence à Cross of Iron
Mouai Vim FTW!
[12:26] ~ % cat > /tmp/foo
1ffezfUfev@!!!!!7
KjfeiK544!@_fff
Lokzi78
OIK!aze
!Gf@
mf!
JK
lOkP78Gg#EE
AE89fv
@ZE1
^C
[12:26] ~ % vim /tmp/foo +'%s/^\(.*\)$/\=strdisplaywidth( submatch(0) ) . " " . submatch(0)/' +'%sort n' +'%s/^\d\+\s//' +'wq'
[12:27] ~ % cat /tmp/foo
JK
mf!
!Gf@
@ZE1
AE89fv
Lokzi78
OIK!aze
lOkP78Gg#EE
KjfeiK544!@_fff
1ffezfUfev@!!!!!7
(source https://stackoverflow.com/questions/11531073/how-do-you-sort-a-range-of-lines-by-length )
Le 26 février 2019 à 15:30:48 DarthSyphilis a écrit :
Le 26 février 2019 à 15:20:37 godrik a écrit :
si deux mots ont la meme taille.comment les tries tu? quel est la taille des fichiers que tu veux trier?Mon but est de pouvoir supprimer toutes les lignes ayant moins de 4 caractères.
sed -r '/^.{,3}$/d' filename
# trier et supprimer les lignes de moins de 4 caractères
while read -r x; do
a[${#x}]=$x
done < fichier
for i in "${!a[@]}"; do
((i < 4)) || echo "${a[i]}"
done
# juste supprimer les lignes de moins de 4 caractères
while read -r x; do
((${#x} < 4)) || echo "$x"
done < fichier
pas besoin de sortir l'artillerie lourde si bash peut le faire