มีการสะกดบรรทัดคำสั่งเพื่อวางคอลัมน์ในไฟล์ CSV หรือไม่


32

มีไฟล์ของเนื้อหาต่อไปนี้:

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

ฉันพยายามรับไฟล์เท่ากับต้นฉบับ แต่ไม่มีคอลัมน์ที่ n เช่น n = 2 (หรืออาจเป็น 3)

1111,2222,4444
aaaa,bbbb,dddd

หรือสำหรับ n = 0 (หรืออาจเป็น 1)

2222,3333,4444
bbbb,cccc,dddd

ไฟล์จริงสามารถเป็นกิกะไบต์ที่มีคอลัมน์ยาวนับหมื่น

เช่นเคยในกรณีดังกล่าวฉันสงสัยว่าผู้วิเศษบรรทัดคำสั่งสามารถนำเสนอทางออกที่สง่างาม ... :-)

ในกรณีจริงของฉันฉันต้องวางคอลัมน์แรก 2 คอลัมน์ซึ่งสามารถทำได้โดยการวางคอลัมน์แรกสองครั้งในลำดับ แต่ฉันคิดว่ามันน่าสนใจกว่าที่จะพูดคุยเล็กน้อย


มีการรับประกันฟิลด์ที่ไม่มี,หรือไม่? (เช่น,เคยใช้เป็นตัวคั่นฟิลด์เท่านั้น)
CVn

@ MichaelKjörlingมันคงจะดีถ้ามีทางออกที่ยืดหยุ่นมากกว่านี้ แต่ในกรณีของฉัน - ใช่: ตัวคั่นคือ,และมันไม่เคยเกิดขึ้นภายในเขตข้อมูล
Ivan

ในกรณีนี้คำตอบของสก็อตต์น่าจะเป็นสิ่งที่เกิดขึ้น
CVn

คำตอบ:


47

ฉันเชื่อว่านี่เป็นสิ่งที่เฉพาะเจาะจงที่จะตัดจาก coreutils ของ GNU:

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

โดยปกติแล้วคุณจะระบุฟิลด์ที่คุณต้องการผ่านทาง -f แต่โดยการเพิ่ม --complement คุณจะย้อนกลับความหมายตามธรรมชาติ จาก 'man cut':

--complement
    complement the set of selected bytes, characters or fields

หนึ่งข้อแม้: หากคอลัมน์ใด ๆ มีเครื่องหมายจุลภาคมันจะถูกตัดออกเนื่องจากการตัดไม่ใช่ตัวแยกวิเคราะห์ CSV ในลักษณะเดียวกับที่สเปรดชีต ตัวแยกวิเคราะห์จำนวนมากมีแนวคิดที่แตกต่างกันเกี่ยวกับวิธีจัดการเครื่องหมายจุลภาคในรูปแบบ CSV สำหรับกรณี CSV ธรรมดาบนบรรทัดคำสั่งการตัดยังคงเป็นวิธีที่จะไป


4
ใช้งานได้ดีตราบใดที่เป็นไฟล์ CSV แบบง่าย หากคอลัมน์ใดคอลัมน์หนึ่งเป็นสตริงที่มีเครื่องหมายจุลภาคอยู่ในนั้นคอลัมน์นั้นก็จะcutหายไปเพราะไม่ใช่ตัวแยกวิเคราะห์ CSV หากเขตข้อมูล CSV มีตัวคั่นฟิลด์ในค่าของมันฟิลด์นั้นจะอยู่ในเครื่องหมายคำพูด Btw ในเรื่องของcut, -fใช้เวลาช่วงฟิลด์ cut -f, -d3-จะเอาท์พุทเขตข้อมูลที่สามบนเอาสองคนแรก
Alexios

2
คุณหมายถึงcut -d, -f3-
ไร้ประโยชน์

@Alexios เป็นจุดที่ดี ฉันไม่เคยจัดการกับ CSV "ของจริง" จริง ๆ เพียงชุดย่อยที่เรียบง่าย ฉันจะแก้ไขคำตอบของฉันเพื่อสะท้อนว่า
Scott McClung

@ ไม่มีประโยชน์: ประณามใช่ นั่นคือสิ่งที่ฉันเรียกว่า 'cut dyslexia' ที่โดดเด่นอีกครั้ง ถอนหายใจ Scott: ไฟล์ CSV เป็นสัตว์ที่หากิน รูปแบบย่อยที่แตกต่างกันมากเกินไปซึ่งบางรูปแบบไม่ได้เป็นC SV แต่มีชื่อเรียกตามแบบแผนอยู่แล้ว
Alexios

นี่จะพิมพ์ CSV ใหม่ไปยังเทอร์มินัลของฉัน - ฉันจะให้มันเขียนทับอินพุตได้อย่างไร (หรืออาจจะเขียนไปที่ไฟล์ใหม่ดูเหมือนว่า OP กำลังมองหา)
Max Ghenis

12

หากข้อมูลนั้นสร้างจากคอลัมน์ที่คั่นด้วยเครื่องหมายจุลภาค:

cut -d , -f 1-2,4-

คุณยังสามารถใช้ awk ได้ แต่มันค่อนข้างน่าอึดอัดใจเพราะในขณะที่การล้างเขตข้อมูลนั้นทำได้ง่ายการเอาตัวคั่นมาใช้งาน หากคุณไม่มีฟิลด์ที่ว่างเปล่ามันก็ไม่ได้แย่เกินไป:

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

ถ้าคุณมี CSV ที่เกิดขึ้นจริงที่เครื่องหมายจุลภาคสามารถปรากฏภายในเขตถ้าอ้างอย่างถูกต้องคุณต้องมีห้องสมุด CSV จริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.