awk, dizeden beklenmedik şekilde nokta kaldırır


9

Bir .csvdosyaya bir sütun (2. sıra) eklemek istiyorum ve ben bu sütunun değerleri dizeleri ve alıntı olmak istiyorum;

Aşağıdaki komut sütunu ekler, ancak tırnak işaretleri olmadan:

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

Aşağıdaki yaklaşım, tırnak işaretlerini içerir, ancak bir nedenden dolayı son .(nokta) değerini değerden kaldırır

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

bu yüzden değerlerim "2.40" olur.

Bunu nasıl yapmalıyım?


Dosyanızda 2 veya daha fazla sütun varsa, ikinci sütunu eklemek mi yoksa değiştirmek mi istiyorsunuz?
ctac_

sadece
birinciden

2
Tamam, eklemek için şunu kullanmalısınız: awk 'BEGIN {FS = OFS = ","} {$ 1 = $ 1 ", \" 2.4.0 \ ""} 1'
ctac_

1
veya awk '{sub (",", ", \" 2.4.0 \ ",")} 1'
ctac_

Yanıtlar:


12

Tırnak işaretleri yanlış gözüküyor. Aşağıdaki gibi yapmanız gerekir

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

Bu GNU awk man sayfasında açıklanmaktadır - 3.2 Kaçış Dizileri

Bazı karakterler tam olarak dize sabitlerine ("foo")veya regexp sabitlerine ( /foo/) dahil edilemez . Bunun yerine, ters eğik çizgi ( \) ile başlayan karakter dizileri olan kaçış dizileri ile temsil edilmelidirler . Bir kaçış dizisinin kullanımlarından biri, bir dize sabitine bir çift tırnak karakteri eklemektir. Düz bir çift tırnak dizgeyi sonlandırdığından, dizenin \"bir parçası olarak gerçek bir çift tırnak karakterini temsil etmek için kullanmalısınız .


Davranışın nedenini anlayabildiğim kadarıyla, OP'nizden ekstra alıntılarla sayısal bir kelime olarak awkyorumlanmış 2.4.0gibi görünüyor ve ilk noktadan sonra hassasiyeti kaybetmeye karar veriyor.

yani

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

sadece olur

$2=""2.4.0""

hangi awkartık bir dize olarak anlamaktadır. Bu davranışı basitçe yaparak yeniden oluşturabilirsiniz.

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

bunu yaptığınızda sonuç olur

awk 'BEGIN { print 2.4.0 + 0 }'

1
@roaima: Ben birikimini ettik, ne öyle görünüyor itibaren sadece dışarı iptal ve sadece sonuçlanan etmiş { print 2.4.0 }veya { print 2.4.0 + 0 }olmayan bir dize bileşeni olarak, yani. Ben de ilgili dokümanları aramaya çalıştım, ama yapamadım
Inian

2
Bazen kullandığım alıntıları eklemenin başka bir yolu, bir değişken tanımlamaktır, örneğin:awk -v q='"' '... print q "2.4.0" q ...
Thor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.