-
awk, sed ou autre?
Bonjour,
Voilà je me retrouve avec un problème de conversion dans un fichier.
Je m'explique, via une extraction de base de données, j'obtiens un fichier texte dont les champs se retrouvent séparés par un "~". Là ou je rencontre un problème est que le 15e champs de ma table peut être à 0 et si c'est le cas, dans mon fichier texte, je dois le remplacer par 'NULL'.
j'ai crus vois que l'on pouvais avec awk déifnir le séparateur avec FS et ainsi utiliser $x pour lire un champs spécifique cependant je n'ai pas trouvé comment remplacer cette même donnée.
est-ce que quelqu'un aurait une idée pour solutionner cela?
Merci
-
Bonjour,
Avec awk, je sais pas trop, ce serait plutôt du genre de ce qui suit pour afficher ce qui est lu, mais pour le test sur $15, je n'ai pas vraiment d'idée :
Code:
awk -F'~' '{ print $1" "$2 ... "}'
Avec sed, je ferai un truc du genre :
Code:
sed -e 's/^\([^~]\+~[^~]\+ ... [^~]\+~\)0\(~.*\)$/\1NULL\2/'
Didier
-
Pour Sed, il suffit d'écrire (expressions rationnelles étendues) :
Code:
s/^(([^~]*~){14})0~/\1NULL~/
-
Merci à vous deux pour vos réponses
dtrosset > ta solution me parraît un peut difficile à comprendre :p
j'ai donc test la solution de LLB en effectuant :
sed -e 's/^(([^~]*~){14})0~/\1NULL~/' monfichier.txt
cependant je récolte ceci
sed: -e expression #1, char 28: invalid reference \2 on `s' command's RHS
-
Je ne comprends pas le "invalid reference \2", il y a seulement un \1.
J'imagine que tu as oublié l'option pour utiliser les regexp étendues (-r sur la plupart des sed, -E parfois).
-
en effet j'ai utilisé un -e au lieu d'un -r et là ça fonctionne.
Merci à vous deux.
-
avec awk on pourrait notamment faire :
Code:
awk 'BEGIN{FS=OFS="~"};{if($15==0)$15="NULL";print}'
ou encore
Code:
awk -F~ '{OFS="~";sub(/^0$/,"NULL",$15);print}'