awk elimina inesperadamente el punto de la cadena

9

Quiero agregar una columna (segundo lugar) en un .csvarchivo y quiero que los valores de esa columna sean cadenas y se citen;

El siguiente comando agrega la columna pero sin comillas:

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

El siguiente enfoque incorpora las comillas, pero por alguna razón elimina el último .(punto) del valor

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

entonces mis valores terminan siendo "2.40".

¿Cómo debo hacer esto?

pkaramol
fuente
Si su archivo tiene 2 o más columnas, ¿desea insertar o reemplazar la segunda columna?
ctac_
simplemente inserte una columna después de la primera
pkaramol
2
ok, entonces para insertar, debes usar: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
o awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Respuestas:

12

Parece que tienes las citas equivocadas. Necesitas hacer lo siguiente

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

Esto se explica en la página de manual de GNU awk - 3.2 Secuencias de escape

Algunos caracteres no se pueden incluir literalmente en constantes de cadena ("foo")o constantes regexp ( /foo/). En cambio, deben representarse con secuencias de escape, que son secuencias de caracteres que comienzan con una barra diagonal inversa ( \). Un uso de una secuencia de escape es incluir un carácter de comillas dobles en una constante de cadena. Debido a que una comilla doble simple termina la cadena, debe usarla \"para representar un carácter real de comillas dobles como parte de la cadena.


En cuanto a la razón por la que pude entender la razón del comportamiento, awkparece haber interpretado 2.4.0como una palabra numérica con las comillas adicionales de su OP y decide perder la precisión después del primer punto.

es decir

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

se vuelve justo

$2=""2.4.0""

que awkya no entiende como una cadena. Puede reproducir este comportamiento simplemente haciendo

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

que resulta ser el resultado cuando lo haces

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
fuente
1
@roaima: Por lo que sé, parece que simplemente se canceló y solo resultó en { print 2.4.0 }o { print 2.4.0 + 0 }, es decir, como un constituyente sin cadenas. Traté de buscar documentos relevantes también, pero no pude
Inian
2
Otra forma de agregar convenientemente citas que a veces uso, es definir una variable, por ejemplo:awk -v q='"' '... print q "2.4.0" q ...
Thor