AWK tiba-tiba menghapus titik dari string

9

Saya ingin menambahkan kolom (tempat ke-2) dalam .csvfile dan saya ingin nilai-nilai kolom itu menjadi string dan dikutip;

Perintah berikut menambahkan kolom tetapi tanpa tanda kutip:

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

Pendekatan berikut memang menggabungkan tanda kutip, tetapi karena alasan tertentu ia menghilangkan titik terakhir .dari nilai

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

jadi nilai saya akhirnya menjadi "2,40".

Bagaimana saya harus melakukan ini?

pkaramol
sumber
Jika file Anda memiliki 2 kolom atau lebih, Anda ingin memasukkan atau mengganti kolom kedua?
ctac_
cukup masukkan kolom setelah yang pertama
pkaramol
2
ok, jadi untuk memasukkan, Anda harus menggunakan: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_
1
atau awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Jawaban:

12

Tampaknya Anda salah mengutip. Anda perlu melakukan seperti di bawah ini

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

Ini dijelaskan di halaman manual GNU awk - 3.2 Escape Sequences

Beberapa karakter tidak dapat dimasukkan secara harfiah dalam konstanta string ("foo")atau konstanta regexp ( /foo/). Sebaliknya, mereka harus diwakili dengan urutan melarikan diri, yang merupakan urutan karakter dimulai dengan garis miring terbalik ( \). Salah satu penggunaan urutan pelarian adalah memasukkan karakter tanda kutip ganda dalam konstanta string. Karena kutipan ganda sederhana mengakhiri string, Anda harus menggunakan \"untuk mewakili karakter kutipan ganda yang sebenarnya sebagai bagian dari string.


Sejauh alasan saya bisa memahami alasan perilaku itu, awktampaknya telah ditafsirkan 2.4.0sebagai kata numerik dengan kutipan tambahan dari OP Anda dan memutuskan untuk kehilangan presisi setelah titik pertama.

yaitu

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

menjadi adil

$2=""2.4.0""

yang awktidak lagi dipahami sebagai string. Anda dapat mereproduksi perilaku ini hanya dengan melakukan

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

yang kebetulan merupakan hasil ketika Anda melakukannya

awk 'BEGIN { print 2.4.0 + 0 }'
Inian
sumber
1
@roaima: Dari yang saya tahu, sepertinya baru saja dibatalkan dan hanya menghasilkan { print 2.4.0 }atau { print 2.4.0 + 0 }, yaitu sebagai konstituen non-string. Saya sudah mencoba untuk mencari dokumen yang relevan juga, tetapi tidak bisa
Inian
2
Cara lain dengan mudah menambahkan kutipan yang kadang-kadang saya gunakan, adalah mendefinisikan variabel, misalnya:awk -v q='"' '... print q "2.4.0" q ...
Thor