Question awk, sed - fichier avec délimiteur

Toto -  
asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   -
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 ?
Configuration: SUN SOLARIS

4 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. TotoPoilenbiais Messages postés 2 Statut Membre
       
      merci bcp , je vais essayer ...
      je te donne bientot de mes nouvelles
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  3. TotoPoilenbiais Messages postés 2 Statut Membre
     
    >>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
  4. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    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