Remplacer la colonne si elle est égale à une valeur spécifique

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 
  • Nous définissons les séparateurs de champs d’entrée et de sortie sur , pour conserver les délimiteurs dans votre fichier csv
  • Nous vérifions le quasortingème champ s’il est égal à “N / A”, puis nous lui atsortingbuons la valeur -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.

Test exécuté sur un fichier exemple:

 $ 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