awk nieoczekiwanie usuwa kropkę z łańcucha

9

Chcę dodać kolumnę (2. miejsce) do .csvpliku i chcę, aby wartości tej kolumny były ciągami znaków i były cytowane;

Następujące polecenie dodaje kolumnę, ale bez cudzysłowów:

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

Poniższe podejście obejmuje cudzysłowy, ale z jakiegoś powodu usuwa ostatnią .(kropkę) z wartości

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

więc moje wartości to „2,40”.

Jak mam to zrobić?

pkaramol
źródło
Jeśli plik ma 2 lub więcej kolumn, chcesz wstawić lub zastąpić drugą kolumnę?
ctac_
wystarczy wstawić kolumnę po pierwszej
pkaramol
2
ok, więc aby wstawić, musisz użyć: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
lub awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Odpowiedzi:

12

Wygląda na to, że masz błędne cytaty. Musisz zrobić jak poniżej

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

Jest to wyjaśnione na stronie podręcznika GNU awk - 3.2 Sekwencje specjalne

Niektóre znaki nie mogą być zawarte dosłownie w stałych ("foo")ciągowych lub stałych wyrażenia regularnego ( /foo/). Zamiast tego powinny być reprezentowane przez sekwencje specjalne, które są sekwencjami znaków rozpoczynającymi się od ukośnika odwrotnego ( \). Jednym z zastosowań sekwencji ucieczki jest włączenie znaku podwójnego cudzysłowu do stałej ciągu. Ponieważ zwykły podwójny cudzysłów kończy ciąg, musisz użyć go \"do przedstawienia rzeczywistego podwójnego cudzysłowu jako części łańcucha.


O ile rozumiem powód takiego zachowania, awkwydaje się, że interpretowałem je 2.4.0jako słowo numeryczne z dodatkowymi cytatami z twojego OP i postanawia stracić precyzję po pierwszej kropce.

to znaczy

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

staje się sprawiedliwy

$2=""2.4.0""

który awknie jest już rozumiany jako ciąg. Możesz odtworzyć to zachowanie, po prostu robiąc

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

co zdarza się, gdy to robisz

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
źródło
1
@roaima: Z tego, co wiem, wydaje się, że właśnie anulowało się i po prostu skutkowało { print 2.4.0 }lub { print 2.4.0 + 0 }, tj. jako składnikiem nieciągłym. Próbowałem również przeszukać odpowiednie dokumenty, ale nie mogłem
Inian
2
Innym sposobem wygodnego dodawania cudzysłowów, których czasami używam, jest zdefiniowanie zmiennej, np .:awk -v q='"' '... print q "2.4.0" q ...
Thor