Awk - remplace un seul caractère dans une certaine colonne

13

J'ai un fichier comme celui-ci:

2018.01.02;1.5;comment 1
2018.01.04;2.75;comment 2
2018.01.07;5.25;comment 4
2018.01.09;1.25;comment 7

Je veux remplacer tous les points .de la deuxième colonne par une virgule ,comme je le ferais avec la sed 's/\./\,/g' filefaçon dont je peux utiliser sedou de préférence awkappliquer uniquement cela pour la deuxième colonne, donc ma sortie ressemblerait à ceci:

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
nath
la source

Réponses:

22
$ awk 'BEGIN{FS=OFS=";"} {gsub(/\./, ",", $2)} 1' ip.txt
2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
  • BEGIN{} ce bloc de code sera exécuté avant de traiter toute ligne d'entrée
  • FS=OFS=";" définir le séparateur de champ d'entrée et de sortie comme ;
  • gsub(/\./, ",", $2)pour chaque ligne d'entrée, remplacez tous les .dans le 2ème champ par,
  • 1est un idiome awk pour imprimer le contenu de $0(qui contient l'enregistrement d'entrée)
Sundeep
la source
1
génial, beaucoup de THX!
nath
9
sed 's/\./,/3' file

remplacer la troisième occurrence du point

Emilio Galarraga
la source
2
Une autre utilisation des utilisations de cat... Pourquoi pas seulement sed 's/\./,/3' file? (De plus, la virgule n'a pas besoin d'être échappée.)
twalberg
J'ai pris en compte les observations
Emilio Galarraga
catne serait pas nécessairement inutile ici. Cela permettrait à l'opération d'utiliser 2 cœurs.
ron rothman
@ronrothman quel serait le but du fonctionnement de base cat, autre que l'utilisation des ressources? Peut-être pour fournir un petit tampon, mais alors cette intention devrait être mieux exprimée par un outil comme bufferque par cat.
Roland Illig
Pour découpler le disque (bloquant) lit à partir du remplacement de chaîne. Oui, je suppose que vous pouvez le considérer comme un tampon.
ron rothman du
4

Fait par la méthode ci-dessous en utilisant awk

Commander: awk -F ";" '{gsub(/\./,",",$2);print $1";"$2";"$3}' filename

production

2018.01.02;1,5;comment 1
2018.01.04;2,75;comment 2
2018.01.07;5,25;comment 4
2018.01.09;1,25;comment 7
Praveen Kumar BS
la source