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


9

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

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


ファイルに2つ以上の列がある場合、2番目の列を挿入または置換しますか?
ctac_

最初の列の後に列を挿入するだけ
pkaramol

2
はい、挿入するには、次を使用する必要があります:awk 'BEGIN {FS = OFS = "、"} {$ 1 = $ 1 "、\" 2.4.0 \ ""} 1'
ctac_

1
またはawk '{sub( "、"、 "、\" 2.4.0 \ "、")} 1'
ctac_

回答:


12

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

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 }'

1
@roaima:私が知っていることから、キャンセルされて{ print 2.4.0 }or { print 2.4.0 + 0 }になってしまったようです。つまり、非文字列構成要素としてです。私も関連ドキュメントを検索しようとしましたが、できませんでした
Inian

2
私が時々使用する引用符を便利に追加する別の方法は、変数を定義することです。例:awk -v q='"' '... print q "2.4.0" q ...
Thor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.