awk supprime de manière inattendue le point de la chaîne

9

Je veux ajouter une colonne (2e place) dans un .csvfichier et je veux que les valeurs de cette colonne soient des chaînes et soient citées;

La commande suivante ajoute la colonne mais sans guillemets:

awk -F"," 'BEGIN { OFS = "," } {$2="2.4.0"; print}' test.csv > output.csv

L'approche suivante incorpore les guillemets, mais pour une raison quelconque, elle supprime le dernier .(point) de la valeur

awk -F"," 'BEGIN { OFS = "," } {$2="\""2.4.0"\""; print}' test.csv > output.csv

donc mes valeurs finissent par être "2,40".

Comment dois-je procéder?

pkaramol
la source
Si votre fichier comporte 2 colonnes ou plus, vous souhaitez insérer ou remplacer la deuxième colonne?
ctac_
il suffit d'insérer une colonne après la première
pkaramol
2
ok, donc pour insérer, vous devez utiliser: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
ou awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Réponses:

12

Vous semblez vous être trompé. Vous devez faire comme ci-dessous

awk -F"," 'BEGIN { OFS = "," } {$2="\"2.4.0\""; print}' test.csv > output.csv

Ceci est expliqué dans la page de manuel GNU awk - 3.2 Séquences d'échappement

Certains caractères ne peuvent pas être inclus littéralement dans les constantes de chaîne ("foo")ou les constantes d'expression régulière ( /foo/). Au lieu de cela, ils doivent être représentés par des séquences d'échappement, qui sont des séquences de caractères commençant par une barre oblique inverse ( \). Une utilisation d'une séquence d'échappement consiste à inclure un caractère guillemet double dans une constante de chaîne. Dans la mesure où un guillemet double simple termine la chaîne, vous devez utiliser \"pour représenter un caractère de guillemet double réel dans le cadre de la chaîne.


En ce qui concerne la raison pour laquelle j'ai pu comprendre la raison du comportement, awksemble s'être interprété 2.4.0comme un mot numérique avec les guillemets supplémentaires de votre OP et décide de perdre la précision après le premier point.

c'est à dire

$2="\""2.4.0"\""

devient juste

$2=""2.4.0""

qui awkne comprend plus comme une chaîne. Vous pouvez reproduire ce comportement en faisant simplement

awk 'BEGIN { print ""2.4.0"" }'
2.40

qui se trouve être le résultat lorsque vous faites

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
la source
1
@roaima: D'après ce que je sais, il semble avoir juste annulé et résultant juste en { print 2.4.0 }ou { print 2.4.0 + 0 }, c'est-à-dire en tant que constituant non-chaîne. J'ai aussi essayé de rechercher des documents pertinents, mais je n'ai pas pu
Inian
2
Une autre façon d'ajouter facilement des guillemets que j'utilise parfois, est de définir une variable, par exemple:awk -v q='"' '... print q "2.4.0" q ...
Thor