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
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
A voir également:
- Question awk, sed - fichier avec délimiteur
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Fichier host - Guide
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
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}'
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
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=;
est-ce que la première ligne est toujours complète ?
Dans awk, pour définir le séparateur de champs FS=;
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
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
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
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
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:
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
19 juil. 2007 à 17:10
je te donne bientot de mes nouvelles