Question awk, sed - fichier avec délimiteur

Fermé
Toto - 19 juil. 2007 à 09:52
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 - 19 juil. 2007 à 17:46
Bonjour ,

voici mon problème : j'ai un fichier avec des délimiteurs ";"
sur certaine ligne quand le champs est identique à la ligne précédente le champs n'est pas répété

Exemple ceci
AAA; bbb; ccc;dd;ee
Aa2;;cc2;;
Aa3;;;;

correspond à
AAA; bbb; ccc;dd;ee
Aa2;bbb; cc2;dd;ee
Aa3;bbb; cc2;dd;ee

En fait je veux transformer ce fichier et remplacer les trous par les vrais valeurs , j'ai essayer avec la fonction awk, sed mais comme j'ai un peu de mal.

Avez vous des idées ?
A voir également:

4 réponses

dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
19 juil. 2007 à 17:07
Je ferais qqch comme ça, mais j'ai rien testé:
awk -F';' 'NR==1  { for (n=1;n==NF;n++)t[n]=$n; print $0 ; next } ;
	{ for (n=1;n==NF;n++)
		if (length($n) == 0)
			$n=t[n]
		else
			t[n]=$n
	print $0}'
1
TotoPoilenbiais Messages postés 2 Date d'inscription mercredi 18 juillet 2007 Statut Membre Dernière intervention 19 juillet 2007
19 juil. 2007 à 17:10
merci bcp , je vais essayer ...
je te donne bientot de mes nouvelles
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
19 juil. 2007 à 12:22
Est-ce que le nombre de champs est fixe (4) ?
est-ce que la première ligne est toujours complète ?

Dans awk, pour définir le séparateur de champs FS=;
0
TotoPoilenbiais Messages postés 2 Date d'inscription mercredi 18 juillet 2007 Statut Membre Dernière intervention 19 juillet 2007
19 juil. 2007 à 15:44
>>Est-ce que le nombre de champs est fixe (4) ?
oui mais c'est bien plus que 4 (de l'ordre de 15)

>>est-ce que la première ligne est toujours complète ?
oui , heureusement.

>>Dans awk, pour définir le séparateur de champs FS=;
ok merci mais mon problème c'est qu'il fait faire une boucle avec deux valeurs pour chaque chps donc surement un tableau de valeurs et ça je sais pas trop faire en Shell Unix.

merci de m'avoir répondu
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 426
19 juil. 2007 à 17:46
Bonche, j'allais poster un truc, mais j'ai pris mon temp et dubcek a répondu grosso-modo ce que j'allais répondre, donc je confirme que ça fonctionne.

J'ai fait un peu différemment donc je copie/colle quand même:
$ cat test.csv
AAA;bbb;ccc;dd;ee
Aa2;;cc2;;
Aa3;;;;
$ cat test.awk
#!/bin/awk -f
BEGIN {
    FS=";"
    OFS=";"
}
{
    for (i=1;i<=NF;i++)
    {
        if ($i=="")
        {
            $i=OLD[i]
        }
        OLD[i]=$i
    }
    print
}
$ ./test.awk test.csv
AAA;bbb;ccc;dd;ee
Aa2;bbb;cc2;dd;ee
Aa3;bbb;cc2;dd;ee
Pour chaque ligne, on traite champs par champs, (NF = Nombre de champs dans l'enregistrement courant) si le champ est null, on lui assigne l'ancienne valeur, puis on sauvegarde la valeur actuelle comme ancienne valeur, une fois tout les champs traités, on les affiche et on passe a la ligne suivante.

PS: Ceci ne fonctionne que dans le cas ou la première ligne ne contient jamais de champ vide, sinon, je n'ai pas tésté, mais il me semble que c'est ce qui était attendu.

Cordialement
0