การจัดรูปแบบข้อความเป็นคอลัมน์


11

ฉันมีไฟล์ที่มีสองคอลัมน์ดังแสดงด้านล่าง (ตัวอย่าง):

ไฟล์ 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

ฉันต้องการจัดรูปแบบนี้และผลลัพธ์ที่คาดหวังของฉันควรเป็น:

ไฟล์ 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9

1
2 คอลัมน์อยู่ที่ไหน
รายการ MARC

ผลลัพธ์ทั้งสองดูเหมือนจะเหมือนกัน คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับคำถามของคุณได้ไหม?

2
มีการกำหนดคอลัมน์อย่างไร มีแท็บหรืออักขระอื่น ๆ ระหว่างชื่อและหมายเลขหรือไม่ เราจะรู้ได้อย่างไรว่าMichael Rod 3เป็น 2 คอลัมน์และไม่ใช่ 3
terdon

2
ไม่มีไม่ได้โพสต์ภาพของข้อความ ฉันเพิ่งจะคัดลอกและวางข้อความนั้นเพื่อช่วยคุณและตอนนี้ฉันทำไม่ได้
Kusalananda

1
เหมือนกันกับสิ่งที่ mmmint และ terdon พูด; ตัวอย่างเช่นคุณสามารถระบุได้หรือไม่ว่าเป็นคอลัมน์สุดท้ายที่ต้องมีการย่อหน้าเพื่ออนุญาตให้มีความกว้างของบรรทัดที่ยาวที่สุด?
Jeff Schaller

คำตอบ:


18

column -tถ้าใส่ได้รับเพียงสองคอลัมน์ที่ผมจะได้แนะนำให้ใช้ สิ่งนี้ไม่ได้ทำงานที่นี่เนื่องจากcolumnยูทิลิตี้จะจัดการช่องว่างหรือแท็บใด ๆ เป็นตัวคั่นคอลัมน์:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod" เป็นสองคอลัมน์ดังนั้นแถวเดียวมีหนึ่งคอลัมน์มากกว่าอีกแถวหนึ่งซึ่งทำให้เอาต์พุตยุ่งเหยิง

เราสามารถแก้ไขได้โดยใส่อักขระแท็บหน้าคอลัมน์สุดท้ายจากนั้นให้columnใช้ (เท่านั้น) ที่เป็นตัวคั่น:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

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

หากเชลล์ของคุณไม่เข้าใจ$'\t'คุณสามารถเลือกตัวละครอื่นที่ไม่ได้เป็นส่วนหนึ่งของข้อมูลได้:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.