Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2011, 11h23   #1
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
Par défaut bash, echo, tableau

Bonjour,

Je me trouve confronté à un problème.

J'ai un fichier à parser contenant des valeurs de type : label value (1 couple par ligne)
ce fichier peut contenir 1 à x ligne.

Ce que j'aimerais, c'est pouvoir, après avoir parsé le fichier, faire un echo du genre : TXT CONSTANT | label1=value .... labelx=valuex
exemple : DATA | toto=28 tata=298 jean=2000

Actuellement, j'applique un traitement awk à chaque ligne et je les ajoute dans un champ d'un tableau, mais je n'arrive pas à formater une variable avec tous les champs de mon tableau en ligne.

Code :
1
2
3
4
5
6
7
8
9
10
 
#!/bin/bash
declare -a array
count='0'
 
for i in $(cat fichier.test); do
  array[$count]=$(echo $i | gawk '{print $1"="$2}')
  count=$(expr $count ++)
  echo ${array[*]}
done
Mon code fonctionnel s'arrête ici, je suis perdu car je ne vois pas trop comment faire une boucle qui permettrait d'ajouter le contenu des lignes de mon tableau dans un echo d'une seule ligne ....

Si quelqu'un à une idée... Je ne suis pas fermé à un changement de méthode.
Je vais essayer un truc qui me passe par la tête avec AWK mais rien de sur et ça risque d'être tarabiscoté ...

En vous remerciant,

Nelmo
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/12/2011, 11h58   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

regarde comment lire un fichier en shell

faire traîter par awk chaque ligne d'un fichier lu par bash n'est pas correct !
rien que le for item in $(cat fichier) me fait perdre mes mots
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 10/12/2011, 12h08   #3
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
Merci, je vais aller étudier ce post
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2011, 12h37   #4
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
Code :
1
2
3
4
while read champ1 champ2
do array[$count]="$champ1 $champ2"
 echo ${array[$count]}
done < fichier.test
J'ai essayé d'ajouter le signe égal entre les deux champs mais ça me le met à la fin du deuxième. En tout cas, merci pour cette aide sur la bonne façon de lire dans un fichier, ça m'aidera souvent.

Malgré ce problème de =, je ne vois vraiment pas comment mettre toute les lignes de mon tableau dans une seule. La façon facile que je vois, c'est de faire un if elif avec toutes les possibilités. Le fichier devrait compter, en fonction des moments, 1 à 20 lignes maximum. Mais ça doit vraiment pas être propre
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2011, 12h55   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Code :
1
2
while read one two; do arr+=( "${one}=${two}" ); done <tonFichier
echo "texte ${arr[@]}"
Code BASH>=4 :
1
2
mapfile -t array <tonFichier
echo "texte ${array[@]// /=}"
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2011, 20h55   #6
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
Merci pour ces propositions que je n'ai pas forcement compris
En effet, hormis le [@] dont je comprend qu'il permet d'afficher tous les éléments et donc, de tout mettre en ligne.

En ce qui concerne la seconde, je n'ai pas compris mapfile et je suppose que // /= permet de remplacer les espace par le signe égal ? Ceci dit, cela semble sortir correctement en label=value
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 06h13   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Citation:
le [@] […] permet d'afficher tous les éléments et donc, de tout mettre en ligne.
Citation:
// /= permet de remplacer les espace par le signe égal
exact.

mapfile lit les lignes sur son entrée standard, et les place dans un tableau indexé.
voir : help mapfile.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 12h09   #8
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 116
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 116
Points : 26
Points : 26
Merci pour ton aide.
Cela fonctionne, le problème est résolu.
Nelmo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h28.


 
 
 
 
Partenaires

Hébergement Web