awk rimuove inaspettatamente il punto dalla stringa


9

Voglio aggiungere una colonna (2 ° posto) in un .csvfile e voglio che i valori di quella colonna siano stringhe e siano quotati;

Il seguente comando aggiunge la colonna ma senza virgolette:

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

Il seguente approccio incorpora le virgolette, ma per qualche motivo rimuove l'ultimo .(punto) dal valore

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

quindi i miei valori finiscono per essere "2.40".

Come devo procedere?


Se il tuo file ha 2 o più colonne, vuoi inserire o sostituire la seconda colonna?
ctac_4

basta inserire una colonna dopo la prima
pkaramol

2
ok, quindi per inserire, è necessario utilizzare: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_

1
oppure awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Risposte:


12

Sembra che tu abbia sbagliato le virgolette. Devi fare come di seguito

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

Questo è spiegato nella pagina man di GNU awk - 3.2 Escape Sequences

Alcuni caratteri non possono essere inclusi letteralmente in costanti stringa ("foo")o costanti regexp ( /foo/). Invece, dovrebbero essere rappresentati con sequenze di escape, che sono sequenze di caratteri che iniziano con una barra rovesciata ( \). Un uso di una sequenza di escape consiste nell'includere un carattere tra virgolette doppie in una costante di stringa. Poiché una semplice virgoletta doppia termina la stringa, è necessario utilizzare \"per rappresentare un vero carattere tra virgolette doppie come parte della stringa.


Per quanto riguarda il motivo per cui ho potuto capire il motivo del comportamento, awksembra aver interpretato 2.4.0come una parola numerica con le virgolette aggiuntive dal tuo PO e decide di perdere la precisione dopo il primo punto.

vale a dire

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

diventa giusto

$2=""2.4.0""

che awknon capisce più come una stringa. Puoi riprodurre questo comportamento semplicemente facendo

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

che sembra essere il risultato quando lo fai

awk 'BEGIN { print 2.4.0 + 0 }'

1
@roaima: da quello che so, sembra essersi appena annullato e solo risultando { print 2.4.0 }o { print 2.4.0 + 0 }, cioè, come un componente non stringa. Ho provato anche a cercare documenti pertinenti, ma non ci sono riuscito
Inian

2
Un altro modo per aggiungere comodamente le virgolette che a volte uso è quello di definire una variabile, ad esempio:awk -v q='"' '... print q "2.4.0" q ...
Thor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.