Se connecter

Informatique

Linux

Sujet : Faire un tri dans un fichier texte?
1
DarthSyphilis
Niveau 6
26 février 2019 à 13:01:15

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.

Athuro83
Niveau 10
26 février 2019 à 14:17:42

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 !

DarthSyphilis
Niveau 6
26 février 2019 à 15:07:05

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.

godrik
Niveau 21
26 février 2019 à 15:20:37

si deux mots ont la meme taille.comment les tries tu? quel est la taille des fichiers que tu veux trier?

Athuro83
Niveau 10
26 février 2019 à 15:27:36

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 !

DarthSyphilis
Niveau 6
26 février 2019 à 15:30:48

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 :ok:

deepblue
Niveau 13
26 février 2019 à 15:31:12
[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…

godrik
Niveau 21
26 février 2019 à 16:36:46

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.

_ZawaZawaZawa_
Niveau 9
26 février 2019 à 17:22:16

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.

[DarthSyphilis]
Niveau 5
01 mars 2019 à 09:56:22

(pseudo banni d'où le retard de ma réponse)

Tri effectué avec la solution proposée par Athuro83, c'est parfait :)

:merci:

Raskolnik
Niveau 10
04 mars 2019 à 09:49:20

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 :noel:

deepblue
Niveau 13
04 mars 2019 à 12:28:36

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.en

Et je plussoie la référence à Cross of Iron :noel:

Mouai :o)) 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 )

_DarthSyphilis_
Niveau 5
20 juillet 2019 à 08:57:55

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

:cool:

Sepalcure
Niveau 7
20 juillet 2019 à 17:51:40
# 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 :hap:

1
Sujet : Faire un tri dans un fichier texte?
   Retour haut de page
Consulter la version web de cette page