Comment trier la sortie de mes variables avec sort dans mon script bash ?


#1

Salut , je me retrouve bloqué sur un script bash basique me permettant d’extraire le nombre de mots utilisant chaque lettre de l’alphabet de A à Z . le script devra prendre comme paramètre le nom du fichier à analyser .

j’ai dejà mis un poste sur le début de mon exercice et que j’ai résolu tout seule , mais là sur la deuxieme partie je bug ( peut être trop rester sur le pc je pense ) . j’ai 26 variable ( je n’ai pas reussi a faire une chaine avec ‘grep’ pour tout faire tenir sur une seule ligne :confused: … ) qui me donnes toutes un nombre différent , j’aimerais les trier avec une autre variable , mais je n’arrive pas a trouver la syntaxe exacte , quelqu’un la connaîtrait ? :x
je reviens demain je suis crevé . Bye merci de m’avoir lu :slight_smile:

ps : précédent post en rapport avec celui ci . Je suis bloqué sur un petit script de debutant

et voila le script :Capture%20d'%C3%A9cran%20de%202019-09-17%2020-35-03 Capture%20d'%C3%A9cran%20de%202019-09-17%2020-34-36


#2

Peut-tu expliquer ce que tu cherche à faire avec le script en finalité ?


#3

afficher le nombre de fois que “caractère” est présent dans chaque mots du fichier Dicotoutcourt .
je reviens demain . Bye


#4

Comme ça ?

for i in {A..Z}; do echo "${i} = $(grep -io ${i} <~/Bureau/bin/dicotoutcourt | wc -l)";done | sort -nr -k3

Amicalement.

Jean-Marie


#5

Putôt:
for i in {A…Z}; do echo “${i} = $(grep -ic ${i} ~/Bureau/bin/dicotoutcourt)”;done | sort -nr -k3
(on compte directement avec le -c de grep)


#6

Salut Jean-Marie , Salut Sputnik93 , Merci ! trés honnêtement je voulais faire une boucle avec for mais j’etais vite perdu car je ne connais pas toute ses "expressions régulières " , en tout cas je ne les ai jamais toutes réunies comme tu viens de le faire et il me semble en plus que ce soit exactement ça . j’ai pas encore test les zamis.
( for permet de boucler sur plusieurs valeurs définies . à l’interieur de la boucle la variable prend successivement les valeurs indiquées , là c’est {A . . Z} c’est ça ? )
Donc pour mieux comprendre ce que vous m’avez ecris j’aimerais comprendre commande par commande .

Traduit en langage "normale’’ :

pour variable i qui a pour valeur { A . . Z } faire echo double guillement ( pour que les commande puisse être accepter . ou on a oublié les " `` " pour les faire fonctionner ? ( back quiote je crois ça s’appel ) )
donc echo
("${i}=$" pas compris .
rechercher en ignorant la case , et en comptant le nombre d’occurrence , dans le fichier que j’ai entré dans paramètre ($) les valeurs de ma variable {i} et là on donne le nom du fichier en paramètre ? )" ; fini | trier -nombre et inverser le résultat des comparaisons .
-k3 : pas compris , c’est un genre de délimiteur comme cut -d -f ? Mile merci pour m’avoir bien orienté :slight_smile:

grep - i = Ignorer la casse aussi bien dans le MOTIF que dans les fichiers.
(-i est une spécification POSIX.) j’ai pas compris , il ignore quoi ? si c’est maj ou minuscule ? )

edit , bien vue Sputnik ! j’ecrivais ma réponse et j’ai vue la tienne , je me disais " j’espere que la syntaxe est bonne sinon j’suis mort mdr " et je vois ton poste lol . merci pour la correction l’ami , je teste ça de suite mais je fini le poste avant :slight_smile: faut je comprenne tout ce que tu m’as mis :slight_smile:


#7

{a..z} est une expansion du shell bash. D’ailleurs attention, c’est 2 points qu’il faut mettre, pas 3. (je crois que c’est le moteur du forum qui traduit les 2 points en 3) Cette expansion va donner toutes les lettres entre a et z. ça marche aussi avec les chiffres.


#8

yep c’est le moteur qui rajoute 1 “.” effectivement bien vue lol . Je finis de completer l’explication dis moi si je me trompe stp :slight_smile:


#9

@sputmick93 : Bien vu. ça fait toujours un pipe et une commande en moins.

@ morpheus : On n’écrit pas "$i=$.

La syntaxe “$(une commande ou plusieurs avec des pipes)” permet de récupérer la sortie de la commande (ou des plusieurs avec les pipes).

Ainsi, la syntaxe echo “${i} = $(grep -ic ${i} ~/Bureau/bin/dicotoutcourt)” permet d’afficher (commande “echo”) :

  • la valeur de i,
  • la chaîne " = ",
  • le résultat de la commande grep.

Soit, par exemple : “C = 12”

Amicalement.

Jean-Marie


#10

Salut Jean Marie , en faite lorsque j’ai marqué

c’est que je ne comprenais pas pourquoi il fallait mettre après la commande echo : ${i} . mais tu m’as répondu :slight_smile: du coup le “$” du ${i} sert a affiché la valeur de i mais le “$” de $(grep sert quant a lui à remplacer les backquote c’est bien ça ?

Merci de prendre de ton temps pour que j’apprenne .


#11

Oui.

Les deux syntaxes $(commande) et `commande` sont équivalentes.

Amicalement.

Jean-Marie


#12

ok merci :slight_smile: j’ai une autre question , dans http://www.linux-france.org/article/appli/emacs/manuel/html/regexps.html ils expliquent que “$” je cite :
“Est similaire à ^ mais correpond seulement en fin de ligne. Ainsi, x+$ correspond à une cha^ine d’un x ou plus en fin de ligne.” du coup , elle est ou l’info qui dit que pour montrer une valeur on utilise le caractere speciale ‘$’ ? j’arrive pas a trouver >< . meme sur les autres sites c’est pareil :frowning:
https://www.shellunix.com/regexp.html
$ : caractérise la fin de ligne.
openclarroom pareil .
apres peut être que dans un script ça peut prendre plusieurs valeurs , mais je ne vois pas ou c’est expliqué malheureusement :confused:


#13

Ben…,

Il ne faut pas confondre la syntaxe des expressions régulières et celle de bash.

Pour bash, le plus simple et d’aller voir

man bash

Amicalement.

Jean-Marie


#14

je suis aller partout , et sur man bash en premier . et j’y suis encore y aller là pour être sur vue que tu avais l’air de l’être ^^ .
Une expression régulière est associée a une cmd bash . donc ca a tout à voir .
https://fr.wikibooks.org/wiki/Programmation_Bash/Regex ecris ici aussi , wikibooks
( je parle pas des expressions rationnelles qui sont en rapport avec d’autres langage je crois )
j’ai trouvé juste ça sur “$”

Remarques :

  • Les caractères de débuts et fin de chaines ( ^ et $ ) ne fonctionnent pas dans [] où ils ont un autre rôle.

dis moi si jamais tu tombes sur l’info , c’est pas des truck que j’arrive à savoir en apprenant tout seule . bien vue :+1:


#15

Ben…, l’url que tu donnes se termine par “regex”, qui veut bien dire “expressions régulières” (“regular expressions” dans la langue de Shakespeare).

Si tu vas sur la page : http://manpagesfr.free.fr/man/man1/bash.1.html#index, tu trouveras les explications dans la section “substitution de commandes”.

Amicalement.

Jean-Marie


#16

ok , je viens de capter , j’étais focalisé sur mon idée que les regexp et le expression bash etait exactement pareil alors que non , l’une fonctionne avec certaines commandes et l’autre avec le reste des cmd bash . comme expliqué ici :
https://www.editions-eni.fr/open/mediabook.aspx?idR=a87c85bbb3f2c4e9a054eee66dbd006c

je cite :

> Pour substituer l’expression par sa valeur, il faut utiliser les caractères spéciaux du shell $(( )).

:joy::rofl: c’est pas le man du shell ça . tu triches ! y’a pas ca sur le miens lol .
merci en tout cas je me casse la tête a chercher depuis taleur j’ai finalement trouver , enfin . c’est grave d’être aussi têtu , une fois qu’on se fait une idée il est dur de voir les choses d’un autre angle . merci pour ta patience .

edit : la c’est double parenthese mais le principe est le même . je pense … x’)


#17

Comment ça, c’est pas le man du shell ?

C’est le man de bash. Il te faut quoi de plus ?

Et attention, la syntaxe $(()) c’est pour la substitution des formules arithmétiques, pas des commandes.

Amicalement.

Jean-Marie


#18

Bah c’est pas le man bash du shell c’est le manuelle bash en anglais traduits en fr par le site , mais nan moi j’ai pas ça sur mon man en fr .
Je veux dire que je l’ai , mais partiellement . depuis peut être des maj ont été faites je sais pas … ( quand on me dit regarde le man , je regarde le man de mon shell générale . comme tout le monde je pense . )


#19

Ben…,

Quand je fais “man bash” sur mon terminal, j’ai bien une section “substitution de commande” dans laquelle, étrangement, je retrouve exactement le même texte que dans celui dont je t’ai fourni l’url.

Bon, c’est vrai, il faut “descendre un peu” dans le man pour y arriver (c’est notamment après la description de toutes les variables du shell).

Amicalement.

Jean-Marie


#20

ouai c’est vrai . autant pour moi je ne l’avais pas vue merci :slight_smile: