web-dev-qa-db-ja.com

awkが予期せず文字列からドットを削除する

.csvファイルに列(2番目の場所)を追加し、その列の値を文字列にして引用符で囲みます。

次のコマンドは列を追加しますが、引用符は付けません。

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

次のアプローチは引用符を組み込んでいますが、何らかの理由で最後の.(ドット)を値から削除します

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

したがって、私の値は「2.40」になります。

これについてどうすればいいですか?

9
pkaramol

引用符が間違っているようです。以下のようにする必要があります

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

これは GNU awk manページ-3.2エスケープシーケンス で説明されています

一部の文字は、文字列定数("foo")または正規表現定数(/foo/)にそのまま含めることができません。代わりに、バックスラッシュ(\)で始まる文字シーケンスであるエスケープシーケンスで表す必要があります。エスケープシーケンスの1つの用途は、文字列定数に二重引用符を含めることです。プレーンな二重引用符で文字列が終了するため、実際の二重引用符文字を文字列の一部として表すには、\"を使用する必要があります。


動作の理由を理解できた限り、awk2.4.0をOPからの余分な引用符を含む数値のWordとして解釈し、最初のドットの後に精度を失うことにしました。

つまり.

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

ちょうどなる

$2=""2.4.0""

awkは文字列として理解できなくなりました。この動作を再現するには、次のようにします。

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

あなたがするとき、それはたまたま結果です

awk 'BEGIN { print 2.4.0 + 0 }'
12
Inian