Je cherche à remplacer la quasortingème colonne dans un fichier CSV si elle est égale à N/A
J’essaie de le changer à -1
.
Je n’arrive pas à faire fonctionner ça.
awk -F , '{ if($4 == "N/A") {$4 = -1} }' test.csv
Vous pouvez utiliser le awk
suivant:
awk -F, '{ $4 = ($4 == "N/A" ? -1 : $4) } 1' OFS=, test.csv
,
pour conserver les délimiteurs dans votre fichier csv -1
sinon nous conservons la valeur telle quelle. 1
à la fin imprime votre ligne avec ou sans 4ème colonne modifiée selon que notre test a réussi ou non. ($4=="N/A"?-1:$4)
est un opérateur ternaire qui vérifie si la condition $4=="N/A"
est vraie ou non. Si c’est vrai ?
alors nous assignons -1
et si faux :
nous gardons le champ tel quel. $ cat file a,b,c,d,e,f 1,2,3,4,5,6 44,2,1,N/A,4,5 24,sdf,sdf,4,2,254,5 a,f,f,N/A,f,4
$ awk -F, '{ $4 = ($4 == "N/A" ? -1 : $4) } 1' OFS=, file a,b,c,d,e,f 1,2,3,4,5,6 44,2,1,-1,4,5 24,sdf,sdf,4,2,254,5 a,f,f,-1,f,4
Voici un autre awk
(utilisant des exemples de données de jaypal)
awk -F, '$4=="N/A" {$4=-1}1' OFS=, file a,b,c,d,e,f 1,2,3,4,5,6 44,2,1,-1,4,5 24,sdf,sdf,4,2,254,5 a,f,f,-1,f,4
Vous pourriez aussi le faire dans sed
,
$ sed -r 's/^([^,]*),([^,]*),([^,]*),N\/A,(.*)$/\1,\2,\3,-1,\4/g' file a,b,c,d,e,f 1,2,3,4,5,6 44,2,1,-1,4,5 24,sdf,sdf,4,2,254,5 a,f,f,-1,f,4
Voici une alternative pour awk, et une expression rationnelle plus courte pour sed: j’ai utilisé une regex contenant les caractères séparateurs des deux côtés.
Si votre fichier est séparé par des tabulations, vous pouvez utiliser \t
au lieu de,.
sed 's/,N\/A,/,-1,/g' infile.csv > outfile.csv
Remplacez sur le même fichier, bon pour les gros fichiers, testez avant de l’utiliser !!
sed -i 's/,N\/A,/,-1,/g' infile.csv