awk が予期せず文字列からポイントを削除します。

awk が予期せず文字列からポイントを削除します。

ファイルに列(2番目の場所)を追加し、.csvその列の値を文字列として引用したいと思います。

次のコマンドは、引用符なしで列を追加します。

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」になります。

私は何をすべきですか?

ベストアンサー1

引用符を間違って入力したようです。次のようにする必要があります。

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

これはGNU awk マニュアルページ - 3.2 エスケープシーケンス

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


動作の理由がわかる限り、OPの引用符が追加された数字の単語として解釈され、最初のポイント以降のawk精度2.4.0を失うことに決めたようです。

つまり

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

正義になる

$2=""2.4.0""

awkこれ以上文字列として理解されていません。以下を行うと、この動作を再現できます。

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

こうすれば結果はこうなる

awk 'BEGIN { print 2.4.0 + 0 }'

おすすめ記事