logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 08-02-2016 21:19:54

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Bash et autovivification?

Bonjour

Autovivification : Sous ce terme barbare se cache une idée simple : si vous tentez de modifier un élément d'une table de hachage qui n'existe pas, il sera créé. S'il est utilisé dans un contexte numérique, il prendra pour valeur initiale zéro. S'il est utilisé dans un contexte de chaîne de caractères, il prendra pour valeur la chaîne vide (depuis Perl 5.6).

Mon programme (idée) serait de mettre en correspondance des éléments avec des valeurs, comme ses éléments sont uniques j'ai pensé à tables de hachages (avec couple clé/valeurs je l'ai fait ça marche bien);
la dénomination des éléments étant inconnu lors du lancement du programme j'ai plusieurs fichiers et les éléments de l'un ne seront pas forcément les éléments de l'autre.
EX: fic_1  contient les éléments :Pomme, banane,poire, banane  (au final Pomme=1, banane=2, poire=1)
fic_2 contient les éléments suivant: ananas, pomme, fraise (au final pomme=1, ananas=1, fraise=1)
l'autovivification me permettrait de ne pas avoir de listes pré-établie, et à ma connaissance seul Perl est capable de le faire, mais comme  j'ai commencer à faire  un script bash, ça m'ennuie (c'est pas très esthétique) d'appeler un programme perl.
Question n°1: Puis je faire de l'autovivification en bash?
Question n°2: Puis je faire du sed en Perl ? (si la réponse à la question 1 est négative)
Question n°3: Les données une fois analyser seront dans un fichier, comme les données sont (dans mon esprit) en arbre binaire quel est le meilleur type de fichier sachant que après ses données pourraient aller dans une base Sqlite ou mis en forme dans un tableau HTML? Moi après le CSV je pensais a du XML...



PS: surtout que dans le script bash j'appelle un script sed pour mettre en forme un fichiers initial.. tongueroll
Oui, je pourrais faire une boucle for d'un tableau élément pour voir si y'a pas de doublons mais ça alourdirait le code (la lisibilité)
Merci à vous


La difficulté est source d'apprentissage

Hors ligne

#2 14-02-2016 15:50:55

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

Alors après recherche intensive je ne crois pas que le bash fasse de l'autovivification. Pour mon projet j'ai fait un mix entre des fichiers perl (le langage pour l'autovvivification et écrire dans un fichier) et bash (plus pour l'automatisation des tâches) .. et je crois que je vais faire un fichier CSV pour transmettre les informations parceque sed, awk et grep marcheront bien mieux qu'en XML ou JSON (en plus que je ne les maitrîse pas trop en profondeur) et puis j'ai pas trop envie de me casser le *** et pour ajouter des infos facilement.

La difficulté est source d'apprentissage

Hors ligne

#3 14-02-2016 16:41:44

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : Bash et autovivification?

Wouaaaaaaah !
Et tu as des exemples pratiques faciles à indiquer de l'utilisation de l'autovivification hors du contexte technique ? smile

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#4 14-02-2016 20:57:22

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

oui, par exemple en français. Disons que ta prof n'aime pas que tu fasses des répétitions et ben l'autovivification peut compter le nombre de fois qu’apparaît un même mot dans une ligne (la ligne se termine par un \n). Exemple dans la phrase

smolski bonjour  smolski .


L'autovivification va te dire
smolski => 2
bonjour =>1
si ça t'intéresse je te conseillehttp://formation-perl.fr/ au chapitre 6 (de Sylvain Lhullier)

Dernière modification par Spirale21 (14-02-2016 20:58:33)


La difficulté est source d'apprentissage

Hors ligne

#5 14-02-2016 23:34:51

smolski
quasi...modo
Lieu : AIN
Distrib. : backports (buster) 10
Noyau : Linux 4.19.0-8-amd64
(G)UI : gnome
Inscription : 21-10-2008

Re : Bash et autovivification?

parfait merci smile

saque eud dun (patois chtimi : fonce dedans)

Hors ligne

#6 15-02-2016 10:56:42

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Spirale21 a écrit :

Alors après recherche intensive je ne crois pas que le bash fasse de l'autovivification.


De toute façon, la gestion des tableau associatif (comme on les appelle dans bash) est assez limitée.

Mais ton exemple peut être fait en bash :


#! /bin/bash
# On initialise le tableau indicé phrase
phrase=(smolski bonjour smolski)
# On déclare le tableau associatif comptage (-A) dont les valeur seront
# des entiers (-i)
declare -A -i comptage

# on initalise le tableau associatif
for mot in "${phrase[@]}"; do
    # si $comptage[$mot] est vide on l'initialise à 0
    [ -z "$comptage[$mot]" ] && $comptage[$mot]=0
    # on ajoute 1 à la valeur de comptage[$mot]
    let comptage[$mot]=${comptage[$mot]}+1
done

# Parcours du tableau associatif pour l'affichage.
for clef in "${!comptage[@]}"; do
    echo $clef: ${comptage[$clef]}
done
 


Honnêtement, en bash, je trouve cela très bizarre, perl est bien plus simple big_smile

Hors ligne

#7 15-02-2016 11:11:29

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

Honnêtement, en bash, je trouve cela très bizarre, perl est bien plus simple big_smile


Pareil wink (c'est pour ça que j'utilise perl, Bash alourdit le code) mais pour le traitement des fichiers texte je trouve que les outils GNU sont très puissant (et les shells) et qu'on peut se passer de Perl.


La difficulté est source d'apprentissage

Hors ligne

#8 15-02-2016 11:29:47

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

De plus, il est facile d'initialiser un tableau indicé avec les lignes
d'un fichier.  Il existe une commande interne (builtin) pour cela.
Elle s'appelle mapfile ou readarray (la même commande
qui porte deux noms différents wink).
Par exemple si j'ai le fichier fruits.txt suivant :


banane
poire
pomme
orange
banane
 


Un moyen simple d'initialiser un tableau indicé avec ces valeurs est :


mapfile -t fruits <fruits.txt
 


Cela va créer le tableau fruits, après il facile de compter les
éléments avec la méthode que j'ai indiquée dans le post #6 wink
L'option -t demande à mapfile de supprimer le caractère fin de ligne.
Sinon mapfile laisse ce caractère ce qui n'est pas forcément ce qu'on souhaite.

On peut même initialiser un tableau de mots à partir d'une chaîne :


#! /bin/bash
# une liste sous forme de chaîne
cfruits="banane pomme poire orange banane"
# On transforme notre liste en tableau indicé
IFS=$' ' read -a tfruits <<<$cfruits
# Affichage des éléments du tableau
for fruit in "${tfruits[@]}"; do
    echo $fruit
done
 


Le « IFS=$' ' » permet de demander de découper les mots séparés par
une espace. Je l'ai mis sur la même ligne que le « read -a tfruits… »
pour que cette valeur soit locale pour la commande « read… ».
Ensuite, la valeur de IFS retrouve sa valeur par défaut.

Tu peux en lire d'avantage à ce sujet ici :
http://mywiki.wooledge.org/BashGuide/Arrays

Évidemment, en bash c'est toujours assez cryptique wink

Dernière modification par enicar (15-02-2016 11:35:22)

Hors ligne

#9 15-02-2016 11:32:57

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Spirale21 a écrit :

Question n°2: Puis je faire du sed en Perl ? (si la réponse à la question 1 est négative)


Non, pas vraiment, mais il n'y en a pas besoin en principe. Il suffit de faire
différemment. Il faudrait que tu donnes un exemple de commande sed que
tu veux utiliser pour être plus précis.

Hors ligne

#10 16-02-2016 18:24:14

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

@enicar merci de toute ses précisions... je ne connaissais pas mapfile qui m'a l'air très intéressant big_smilewink
Pour le sed je te donne mon script

/REF/{N;s/\n//g}
/PPL/{N;s/\n//g}
/^$/{N;s/\n//g}
s/ PPL/PPL/g 
s/ REF/REF/g
s/[0-9]\{1,3\}h[0-9]\{2\}//g
s/^[[:space:]]//g
# --- On oublie pas l'entête ---
1,/[0-9][0-9]*/d


bien sûr il n'est pas optimiser... en fait il y a trois lignes (qui doivent se répéter 40 fois)

XXX <- entête à supprimer
Nom
PPL X Y Z E pomme poire
REF poire pomme ananas
XXXX <- re entête
PPL A B C
REF B N J


La difficulté est source d'apprentissage

Hors ligne

#11 16-02-2016 21:27:56

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Il va falloir que tu m'expliques ce qu'est censé faire ton script sed… Je crois que perl est bien
plus simple à comprendre. Je trouve pleins de trucs mystérieux dans ce script. Par exemple


/^$/{N;s/\n//g}
 


Qui dit a sed : si il y a une ligne vide en entrée, tu ajoutes la lignes suivante qui est en entrée
puis tu supprimes tous les « \n »… Donc cela veut dire que tu ajoutes toute ligne qui est
précédée d'une ligne vide indépendamment de ce qu'elle contient. Ce qui est bizarre par rapport
à l'exemple de données à traiter que tu fournis (et qui ne doit pas être représentatif).
J'ai l'impression que tu veux mettre chaque enregistrement sur une seule ligne au lieu de plusieurs.
Est-ce cela ?

Dernière modification par enicar (16-02-2016 21:28:53)

Hors ligne

#12 16-02-2016 21:57:59

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

oui dsl le fichier est:

XXX <- entête à supprimer
Nom
PPL
X Y Z E pomme poire
REF
poire pomme ananas
Nom
XXXX <- re entête
PPL
A B C
REF
B N J


et justement j'ai pas pris Perl car je ne sais pas joindre PPL (ou REF) et la ligne suivante sad le

/^$/{N;s/\n//g}

de sed)
imagine que ton fichier doit donner 12 fichiers distinct (1 par mois) chacun de ses fichier étant entre les deux entêtes... et l'histoire des entêtes aussi je savais pas faire en perl et ouvrir et fermer 12 fichiers.. bref sed me parait plus simple et awk pour mon fichier CSV. Mon fichier CSV doit être lisible par un humain être mis dans une page HTML et dans une base de données et un tableur (style excel ou calc)

Dernière modification par Spirale21 (16-02-2016 21:59:27)


La difficulté est source d'apprentissage

Hors ligne

#13 16-02-2016 22:26:49

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Pour faire cela en perl, il faudrait faire une machine à état simple.
Ça serait plus lent que sed qui est spécialisé dans ce genre de tâche
(quoique, je n'en suis pas si sûr…). Il faut que je réfléchisse pour te donner
un exemple simple. Ça sera l'occasion de refaire du perl,
pour mes scripts je fais plus volontiers du ruby wink

Hors ligne

#14 16-02-2016 23:49:51

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

J'ai concocté un petit programme, qui ne fait pas exactement ce que
fait ton programme sed, mais qui montre la marche à suivre pour
faire la même chose en perl :


#! /usr/bin/perl

$state="ENTETE";
@lignes=();
@mois=("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet",
    "Août", "Septembre", "Octobre", "Novembre", "Décembre");

$mois=0;
$"="\n";

open(FIK, "<sample.txt") || die;
while(<FIK>) {
    if ($state eq "ENTETE") {
        if (/[0-9]+/) {
            $state="SUIVANT";
        }
        next;
    }
    chomp;
    if ($state eq "SUIVANT") {
        if (/REF/) {
            $state="REF";
            temp=$_;
            next;
        }
        if (/PPL/) {
            $state="PPL";
            temp=$_;
            next;
        }
        push(@lignes, $_);
        next;
    }
    if ($state eq "PPL") {
        push(@lignes, $temp.$_);
        $state="SUIVANT";
        next;
    }
    if ($state eq "REF") {
        push(@lignes, $temp.$_);
        $state="ENTETE";
        $file="Prefixe_$mois[$mois].extension"
        open(FIK2, ">$file") || die;
        print FIK2 "@lignes\n";
        close(FIK2);
        @lignes=();
        $mois++;
    }
}
close(FIK);
 


Ce code est écrit volontairement sans astuces pour être facilement
compréhensible. Si il y a besoin, n'hésite pas à demander des explications wink
Enfin, c'est juste un exemple, ce programme n'est pas destiné à être
utilisé en production. D'autant que je ne sois pas sûr qu'il marche.
On doit pouvoir faire nettement mieux, mais bon…

Dernière modification par enicar (17-02-2016 12:10:08)

Hors ligne

#15 17-02-2016 08:44:09

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

$status c pareil que $state? Oui faut le modifier car l'entête fait à peut près 15 lignes... (bon je l'ai pas dit faut dire) mais j'avais pas pensé à
push et la concaténation en même temps...Merci big_smile, la prochaine fois j'y penserais (la vitesse n'est pas ma priorité du moment que ça prend moins de 30 secondes smile et c pour moi pas pour une diffusion à grande échelle smile), et je savais pas que m// pouvait être utilisé sans l'opérateur de correspondance =~ mais juste en condition. Enfin merci pour les idées

La difficulté est source d'apprentissage

Hors ligne

#16 17-02-2016 12:40:14

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Spirale21 a écrit :

$status c pareil que $state?


Oui, je me suis trompé, mais c'est corrigé wink

Spirale21 a écrit :

Oui faut le modifier car l'entête fait à peut près 15 lignes...


Et bien dans ton script sed tu ne tiens pas compte du nombre de lignes, mais
tu vires tout ce qu'il y a entre la première ligne le motif « /[0-9]+/ ». Et c'est ce que devrais faire
mon script, il me semble.

Spirale21 a écrit :

je savais pas que m// pouvait être utilisé sans l'opérateur de correspondance =~ mais juste en condition.


Quand tu l'utilises sans l'opérateur =~, il est sous entendu. « /REF/ » est équivalent à « $_ =~ /REF/ ».
De même : while (<FIK>) » est équivalent à « while ($_ = <FIK>) », qui permet de lire une ligne
en entrée et de la stocker dans $_.

En principe, ce sont mêmes des raccourcis qu'il ne faut pas trop utiliser, mais là je voulais
écrire un truc vite fait wink

On peut faire complétement différemment et se passer de la variable $state, mais alors
il faut surveiller que l'on est pas en fin de fichier avec eof. (Mais ce n'est pas
très perlish wink)

Si ton entête fait toujours le même nombre de lignes, il est possible d'utiliser une autre technique pour
la sauter, en utilisant la variable $. (appelé aussi $INPUT_LINE_NUMBER).

Note que  j'ai utilisé $" ($LIST_SEPARATOR) qui est le caractère utilisé comme
séparateur pour les tableaux interpolé dans les chaînes entre ". On peut aussi utiliser join,
mais bon, j'ai utilisé quelques raccourcis commodes de perl wink

Dernière modification par enicar (17-02-2016 12:42:12)

Hors ligne

#17 17-02-2016 22:12:47

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

et ben... d'accord plein de sous entendu, c cool j'apprends plein de chose.. Je vais peut être être pointilleux mais entre les entêtes y'a plein de noms différents et quand tu ouvres le fichiers d'un mois tu l'ouvres en écrasant donc le PPL du 2e nom va écraser le PPL du premier nom?
Oui j'avais pas saisi que

if /REF/ ct pareil que if ($_=~m/REF/)


Purée t'es trop fort.. moi j'ai galérer pendant 3 jours et toi en un soir tu le fais.... chapeau bas!! c'est là que moi je pleures quand je vois le chemin à parcourir pour jongler avec les fondamentaux du langages... c pour ça que j'ai choisit perl pour sa puissance dans le traitement des chaines de caractères (aussi parce que c livré par défaut sur GNU Linux..;)).

Et Ruby c puissant comme langage? si tu devais donner un de ses domaines de prédilections tu dirais koi?
Comme je t'ai sous la main.:lol: si je te dit langages de statistique descriptive (genre moyenne, écart type, variance, médiane), on peut le faire avec perl (c conseillé)? Et pour la programmation genre socket et réseaux on peut prendre perl?


La difficulté est source d'apprentissage

Hors ligne

#18 17-02-2016 23:13:40

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Spirale21 a écrit :

Je vais peut être être pointilleux mais entre les entêtes y'a plein de noms différents et quand tu ouvres le fichiers d'un mois tu l'ouvres en écrasant donc le PPL du 2e nom va écraser le PPL du premier nom?


Et bien, ce n'était pas dans le cahier des charges… mais c'est facile
d'ouvrir les fichiers en mode mise à jour pour rajouter le nouvel
enregistrement à la fin. Pour faire cela, au lieu de faire :


open(FIK2, ">$file");
 


On fait :


open(FIK2, ">>$file");
 


Le > et le >> correspondent tous les deux au même signes utilisés avec
le shell pour les redirections, et pour les mêmes fonctionnalités.

Spirale21 a écrit :

Purée t'es trop fort.. moi j'ai galérer pendant 3 jours et toi en un soir tu le fais.... chapeau bas!!


Pas du tout, je connais perl depuis 1998, même si je n'en fais plus et
qu'il faut que je regarde dans mon camel book et dans mes anciens
programmes pour voir comment ça fonctionne wink

Spirale21 a écrit :

Et Ruby c puissant comme langage? si tu devais donner un de ses domaines de prédilections tu dirais koi?


Ruby ressemble pas mal à perl sous bien des aspects, toutefois le
langage est entièrement objet.  Cela simplifie bien l'écriture et la
lecture du code. Le créateur de ruby a copié pas mal de choses de perl
tout en adoptant une système de classe qui fait penser à smalltalk, si
ça te parle… Le domaine de prédilection est le même que perl à peu de
choses près.

Spirale21 a écrit :

Comme je t'ai sous la main.:lol: si je te dit langages de statistique descriptive (genre moyenne, écart type, variance, médiane), on peut le faire avec perl (c conseillé)?


On peut probablement le faire en perl, regarde sur le CPAN s'il existe
des modules pour cela.  Mais pour faire des statistiques, il y a un
langage spécialisé le R. Je ne connais pas du tout.

Spirale21 a écrit :

Et pour la programmation genre socket et réseaux on peut prendre perl?


Oui, on peut utiliser perl, mais on peut aussi le faire en ruby ou en
python. Python3 est très bien pour faire de gros projet. Évidemment,
on ne bénéficie pas des raccourcis perl  en python ou en ruby, mais
ces langages ont d'autres moyens d'être très expressifs également.
Remarque que Larry Wall a créé perl justement pour pouvoir avoir
plus de facilité dans la programmation réseau que awk, notamment.


Pour finir, on peut vraiment faire des choses plus élaborées avec perl
en définissant des classes, etc… mais ça rien d'obligatoire.

Hors ligne

#19 17-02-2016 23:17:15

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Tiens au fait, tu sais qu'il existe un script perl, pour tenter de transformer un script sed en script perl.
Il existe la même chose pour awk. Mais les résultats ne sont pas toujours ceux escomptés. Je ne les ai
jamais utilisés, vu que j'ai connu sed et awk après avoir connu perl wink

Hors ligne

#20 18-02-2016 18:54:37

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Il m'est venu l'idée qu'il existait peut être une interface pour le
langage de statistiques R en perl. Ça existe :
https://metacpan.org/pod/Statistics::NiceR

Mais la pente risque d'être raide, entre l'apprentissage de perl
et de R wink

Remarque, le langage que je recommande souvent (bien que ce ne soit pas celui
que j'utilise le plus souvent wink), c'est python. C'est un langage clair comparé à
perl et il y a pleins d'extensions. Si tu te lances dans cet aventure, apprends
python3 directement. Si ça t'intéresse, je peux te passer des liens sur des bouquins
en pdf sur python3 en français.

Hors ligne

#21 18-02-2016 19:15:48

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Bash et autovivification?

Il y a plus simple que d'utiliser le langage R pour faire des
statistiques descriptives. Il existe un module perl pour faire
cela : libstatistics-descriptive-perl

Hors ligne

#22 18-02-2016 20:54:51

Spirale21
Membre
Distrib. : Debian GNU/Linux 9.12 (stretch)
Noyau : Linux 4.9.0-12-amd64
(G)UI : i3
Inscription : 26-02-2013

Re : Bash et autovivification?

Merci smile je vais me pencher dessus..mais j'ai un autre problème (j'ai ouvert un nouveau fil dans le forum) si tu as une solution wink

La difficulté est source d'apprentissage

Hors ligne

Pied de page des forums