วิธีที่ง่ายกว่านั้นคือการใช้ tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
วิธีการทำงานนี้tr
ใช้สองอาร์กิวเมนต์ - ชุดอักขระที่จะถูกแทนที่และการแทนที่ ในกรณีนี้เรามีเพียง 1 ชุดเท่านั้น เราเปลี่ยนเส้นทางสตรีมinput.csv
อินพุตtr
stdin ผ่าน<
โอเปอเรเตอร์ของเชลล์และไพพ์ผลลัพธ์ที่ส่งไปtr -d '"'
ยังเพื่อลบเครื่องหมายคำพูดคู่
แต่ก็awk
สามารถทำได้เช่นกัน
$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
วิธีนี้การทำงานแตกต่างกันเล็กน้อย: awk /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}
อ่านแต่ละบรรทัดไฟล์โดยสายแต่ละเส้นเป็นสคริปต์ ที่นี่เราไม่มีรูปแบบดังนั้นการรัน codeblock สำหรับแต่ละบรรทัด gsub()
ฟังก์ชั่นจะใช้สำหรับการทดแทนทั่วโลกภายในหนึ่งบรรทัดดังนั้นเราจึงใช้มันเพื่อแทนที่ขีดล่างด้วยเครื่องหมายจุลภาคและเครื่องหมายคำพูดคู่ด้วยสตริง null (การลบอักขระอย่างมีประสิทธิภาพ) การแทนที่1
อยู่ในรูปแบบตรงกับการบล็อกโค้ดที่หายไปซึ่งเป็นค่าเริ่มต้นเพียงพิมพ์บรรทัด; กล่าวอีกนัยหนึ่งคือ codeblock ด้วยgsub()
ทำงานและ1
พิมพ์ผลลัพธ์
ใช้การเปลี่ยนเส้นทางเชลล์ ( >
) เพื่อส่งออกไปยังไฟล์ใหม่:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv