Détection séparateur ; via une boucle

Fermé
berrekalamo Messages postés 1 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 30 octobre 2009 - 30 oct. 2009 à 15:42
dubcek Messages postés 18784 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 avril 2025 - 30 oct. 2009 à 17:29
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:

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:

1 réponse

dubcek Messages postés 18784 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 avril 2025 5 630
30 oct. 2009 à 17:29
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 ;

$ 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;
$ 
0