Question awk, sed - fichier avec délimiteur
Toto
-
asevere Messages postés 13521 Statut Webmaster -
asevere Messages postés 13521 Statut Webmaster -
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 ?
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:
- Question awk, sed - fichier avec délimiteur
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
4 réponses
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}'
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=;
est-ce que la première ligne est toujours complète ?
Dans awk, pour définir le séparateur de champs FS=;
>>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
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
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:
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
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;eePour 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
je te donne bientot de mes nouvelles