awk ลบจุดออกจากสตริงโดยไม่คาดคิด


9

ฉันต้องการเพิ่มคอลัมน์ (ที่ 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"

ฉันจะไปเกี่ยวกับเรื่องนี้ได้อย่างไร


หากไฟล์ของคุณมี 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 man - 3.2 Escape Sequences

อักขระบางตัวไม่สามารถรวมอย่างแท้จริงในค่าคงที่สตริง("foo")หรือค่าคงที่ regexp ( /foo/) แต่ควรแสดงด้วย escape sequences ซึ่งเป็นลำดับอักขระที่เริ่มต้นด้วย backslash ( \) การใช้งานหนึ่งในลำดับของการหลบหนีคือการรวมอักขระเครื่องหมายคำพูดคู่ในค่าคงที่สตริง เนื่องจากเครื่องหมายคำพูดคู่ธรรมดาลงท้ายด้วยสตริงคุณต้องใช้\"เพื่อแสดงอักขระเครื่องหมายคำพูดคู่จริงเป็นส่วนหนึ่งของสตริง


เท่าที่เหตุผลที่ฉันสามารถเข้าใจสาเหตุของพฤติกรรมawkดูเหมือนว่าจะตีความ2.4.0ว่าเป็นคำที่เป็นตัวเลขที่มีคำพูดพิเศษจาก OP ของคุณและตัดสินใจที่จะสูญเสียความแม่นยำหลังจากจุดแรก

กล่าวคือ

$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 }หรือ{ 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.