#1 Le 31/10/2017, à 11:08
- spectre128
concatenation information par index
bonjour,
Je cherche comment on peut concatener des fichiers par une information commun à ce fichier.
(c'est pour gerer une MIB avec des OID)
Je m'explique par un exemple:
fichier1:
001 bill
003 marcel
006 bob
fichier2:
001 paris
003 lyon
004 lille
005 lens
006 tours
fichier3:
001 rouge
003 vert
006 jaune
l'info commune est l'index numerique
et j'aimerai obtenir:
fichier4
bill,paris,rouge
marcel,lyon,vert
bob,tours,jaune
Si quelqu'un peux m'orienter sur la methode car je debute en bash.
Merci.
Cordialement.
Hors ligne
#2 Le 31/10/2017, à 11:25
- credenhill
Re : concatenation information par index
hello
$ awk '{t[$1]=t[$1] $2 ","} END {for (n in t){sub(",$", "", t[n]); print t[n]}}' fichier*
marcel,lyon,vert
lille
lens
bob,tours,jaune
bill,paris,rouge
Hors ligne
#3 Le 31/10/2017, à 11:29
- pingouinux
Re : concatenation information par index
Bonjour,
join fichier1 fichier2 | join -o "1.2,1.3,2.2" - fichier3 | sed 's/ /,/g' >fichier4
Hors ligne
#4 Le 31/10/2017, à 11:41
- spectre128
Re : concatenation information par index
Merci Pingouinux et credenhill,
Je viens de tester la commande la plus comprehensible pour moi:
join fichier1 fichier2 | join -o "1.2,1.3,2.2" - fichier3 | sed 's/ /,/g' >fichier4
et cela fonctionne! trop puissant. reste à comprendre la commande join que je ne connaissais pas.
Je regarderai l'autre solution plus tard, je suis pas encore à l'aise avec awk et sed.
Merci à vous.
Cordialement
Hors ligne
#5 Le 31/10/2017, à 14:18
- credenhill
Re : concatenation information par index
en bash
$ unset t; declare -A t; while read X A; do t[$X]+="$A,"; done <<<"$(cat fichier*)"; for X in ${!t[@]}; do echo ${t[$X]%,}; done
bill,paris,rouge
marcel,lyon,vert
lille
lens
bob,tours,jaune
Hors ligne
#6 Le 31/10/2017, à 14:27
- Watael
Re : concatenation information par index
done < fichier*
!!!
<<<(cat fichier*) pfff!
fais gaffe ! on a ton nom et ton adresse...
Dernière modification par Watael (Le 31/10/2017, à 14:29)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 31/10/2017, à 14:47
- credenhill
Re : concatenation information par index
pfff ?
$ ls fichier?
fichier1 fichier2 fichier3
$ unset t; declare -A t; while read X A; do t[$X]+="$A,"; done < fichier*; for X in ${!t[@]}; do echo ${t[$X]%,}; done
bash: fichier*: ambiguous redirect
$
Hors ligne
#8 Le 31/10/2017, à 14:59
- Watael
Re : concatenation information par index
oops.
il y a trop longtemps que je n'ai pas fais lire plusieurs fichiers à une boucle while
en mode POSIX :
$ while read line1
do
read line2 <&3
read line3 <&4
echo "$line1,$line2,$line3"
done < fichier1 3<fichier2 4<fichier3
en bash, read a une option -u pour lire depuis un descripteur de fichier.
ce ne sera jamais
done <<<$(cat fichier*)
mais plutôt
done < <(cat fichier*)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 17/11/2017, à 11:09
- spectre128
Re : concatenation information par index
Bonjour,
la commande join fonctionne tres bien sur des fichiers.
Par contre je n'arrive pas à l'adapter sur des variables $var
j'ai beau essayer des echo "$var1" avec des > ou < ou encore | , je trouve pas
quelqu'n peut me donner la synthaxe pour fusionner 2 variables ?
Merci.
cordialement
Hors ligne
#10 Le 17/11/2017, à 11:32
- Watael
Re : concatenation information par index
le problème semble avoir changé; cela nécessite peut-être un nouveau sujet.
pourqoi les données se retrouvent-elles dans des variables ?
il faut donner le bout de script qui crée ces variables.
Dernière modification par Watael (Le 17/11/2017, à 11:32)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne