inesperadamente remove o ponto da string

9

Quero adicionar uma coluna (2º lugar) em um .csvarquivo e quero que os valores dessa coluna sejam cadeias de caracteres e sejam citados;

O comando a seguir adiciona a coluna, mas sem aspas:

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

A abordagem a seguir incorpora as aspas, mas, por algum motivo, remove o último .(ponto) do valor

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

então meus valores acabam sendo "2,40".

Como devo fazer isso?

pkaramol
fonte
Se o seu arquivo tiver 2 ou mais colunas, você deseja inserir ou substituir a segunda coluna?
Ctac_
Basta inserir uma coluna após o primeiro
pkaramol
2
ok, então para inserir, você deve usar: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
ou awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Respostas:

12

Parece que você entendeu errado as aspas. Você precisa fazer o seguinte

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

Isso é explicado na página de manual GNU awk - 3.2 Escape Sequences

Alguns caracteres não podem ser incluídos literalmente em constantes de string ("foo")ou constantes de expressão regular ( /foo/). Em vez disso, eles devem ser representados com sequências de escape, que são sequências de caracteres começando com uma barra invertida ( \). Um uso de uma sequência de escape é incluir um caractere de aspas duplas em uma constante de string. Como uma aspas duplas simples termina a sequência, você deve usar \"para representar um caractere de aspas duplas real como parte da sequência.


Tanto quanto a razão pela qual eu pude entender a razão do comportamento, awkparece ter sido interpretada 2.4.0como uma palavra numérica com aspas extras do seu OP e decide perder a precisão após o primeiro ponto.

ie

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

torna-se apenas

$2=""2.4.0""

que awknão entende mais como uma string. Você pode reproduzir esse comportamento simplesmente fazendo

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

que passa a ser o resultado quando você faz

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
fonte
1
@roaima: Pelo que sei, parece que acabou de cancelar e acabou resultando em { print 2.4.0 }ou { print 2.4.0 + 0 }, ou seja, como um constituinte não-string. Eu tentei pesquisar documentos relevantes também, mas não consegui
Inian
2
Outra maneira de adicionar convenientemente citações que às vezes uso, é definir uma variável, por exemplo:awk -v q='"' '... print q "2.4.0" q ...
Thor