Détection séparateur ; via une boucle
berrekalamo
Messages postés
1
Statut
Membre
-
dubcek Messages postés 19021 Statut Contributeur -
dubcek Messages postés 19021 Statut Contributeur -
Bonjour,
Je débute en shell Unix et j'avoue j'ai un peu du mal, j'exprime mon problème si une âme charitable voulait bien m'aider:
on a une application émettrice qui nous envoie des fichiers avec séparateur points virgules un peu n'importe comment (de temps en temps avec trop de points virgules, ou pas assez)
on peut avoir ça en entrée:
A156;B1;;;;;;;;;;;;;;;;;;;
C5678;D6688;E09
(valeurs à titre d'exemple)
donc j'ai fait en suivant un exemple trouvé sur le net le petit script suivant:
globalement ça donnait le résultat que je voulais.
vu que l'appli émettrice nous envoie plusieurs type de fichiers j'ai voulu mettre le nombre de colonnes en paramètre d'entrée de manière à pouvoir faire une boucle mon script ressemble donc à ça:
alors si je passe en entrée un fichier qui a une ligne du genre A;B avec 8 colonnes normalement je devrais avoir en sortie un truc du genre A;B;;;;;;;
sauf que le shell me répète le A;B 8 fois
je pense que le soucis vient de C=`echo ${LIGNE} | awk -F";" '{print $AFF}'` et de la variable AFF (j'ai vérifié pourtant qu'elle valait $1 $2 etc.... pour recupérer les champs voulus)
si quelqu'un pouvait éclairer ma lanterne
Merci :)
Je débute en shell Unix et j'avoue j'ai un peu du mal, j'exprime mon problème si une âme charitable voulait bien m'aider:
on a une application émettrice qui nous envoie des fichiers avec séparateur points virgules un peu n'importe comment (de temps en temps avec trop de points virgules, ou pas assez)
on peut avoir ça en entrée:
A156;B1;;;;;;;;;;;;;;;;;;;
C5678;D6688;E09
(valeurs à titre d'exemple)
donc j'ai fait en suivant un exemple trouvé sur le net le petit script suivant:
DATE=`date +%Y%m%d`
HEURE=`date +%H%M%S`
cat $1 | while read LIGNE
do
C1=" "
C2=" "
C3=" "
C4=" "
C1=`echo ${LIGNE} | awk -F";" '{print $1}'`
C2=`echo ${LIGNE} | awk -F";" '{print $2}'`
C3=`echo ${LIGNE} | awk -F";" '{print $3}'`
C4=`echo ${LIGNE} | awk -F";" '{print $4}'`
echo ${C1}";"${C2}";"${C3}";"${C4}>>${DATE}_${HEURE}_$1
done
globalement ça donnait le résultat que je voulais.
vu que l'appli émettrice nous envoie plusieurs type de fichiers j'ai voulu mettre le nombre de colonnes en paramètre d'entrée de manière à pouvoir faire une boucle mon script ressemble donc à ça:
DATE=`date +%Y%m%d`
HEURE=`date +%H%M%S`
cat $1 | while read LIGNE
do
for numero in `seq 1 $2`
do
C=" "
AFF="\$"$numero
echo "AFF="$AFF
C=`echo ${LIGNE} | awk -F";" '{print $AFF}'`
echo "C="$C
ligne_test=$ligne_test$C";"
done
echo ${ligne_test}>>${DATE}_${HEURE}_$1
ligne_test=" "
done
alors si je passe en entrée un fichier qui a une ligne du genre A;B avec 8 colonnes normalement je devrais avoir en sortie un truc du genre A;B;;;;;;;
sauf que le shell me répète le A;B 8 fois
je pense que le soucis vient de C=`echo ${LIGNE} | awk -F";" '{print $AFF}'` et de la variable AFF (j'ai vérifié pourtant qu'elle valait $1 $2 etc.... pour recupérer les champs voulus)
si quelqu'un pouvait éclairer ma lanterne
Merci :)
A voir également:
- Détection séparateur ; via une boucle
- Detection materiel pc - Guide
- Touslesdrivers detection - Télécharger - Pilotes & Matériel
- Via michelin carte - Télécharger - Transports & Cartes
- Partager des photos via un lien - Guide
- ViaMichelin - Télécharger - Transports & Cartes
1 réponse
hello
tu peux tout faire à l'intérieur de awk, puisqu'il connait le nombre de champs (variable NF), $n représente chaque colonne, FS est le séparateur ;
tu peux tout faire à l'intérieur de awk, puisqu'il connait le nombre de champs (variable NF), $n représente chaque colonne, FS est le séparateur ;
$ cat a1
A156;B1;;;;;;;;;;;;;;;;;;;
C5678;D6688;E09
a;b;c
11;;22;33;
$
$ awk -F";" '{for (n=1;n <= NF ; n++){n==NF?c="":c=FS;printf("%s%c",$n,c)};print ""}' < a1
A156;B1;;;;;;;;;;;;;;;;;;;
C5678;D6688;E09
a;b;c
11;;22;33;
$