ฉันจะใช้คอลัมน์เพื่อกำหนดขอบเขตบนแท็บและไม่เว้นวรรคได้อย่างไร


58

ฉันต้องการใช้columnคำสั่งUnix เพื่อจัดรูปแบบข้อความ ฉันมีฟิลด์คั่นด้วยแท็บ แต่ในแต่ละฟิลด์ก็มีช่องว่างด้วย columndelimits บนพื้นที่สีขาว (แท็บและช่องว่าง) ฉันจะทำให้คอลัมน์ใช้แท็บเป็นตัวคั่นได้อย่างไร

ฉันพยายามระบุแท็บเป็นตัวคั่นโดยใช้:

cat myfile | column -t -s"\t"

คำตอบ:


81
column -t -s '\t'

จะแยกคอลัมน์ใน\และtตัวละคร

column -s \tเป็นเช่นเดียวcolumn -s tกับที่แบ็กสแลชถูกตีความว่าเป็นเชลล์โอเปอเรเตอร์

ที่นี่คุณต้องการส่งผ่านอักขระ TAB จริงไปยังคอลัมน์ ด้วย ksh93, zsh, bash, mksh, busybox sh หรือ FreeBSD sh:

column -ts $'\t'

หรือป้อนอักขระแท็บจริงโดยพิมพ์Ctrl-V Tabที่ shell prompt (ภายในเครื่องหมายคำพูดหรือนำหน้าด้วย backslash เนื่องจากอักขระแท็บเป็นตัวคั่นโทเค็นในไวยากรณ์เชลล์เช่นเดียวกับช่องว่าง) หรือใช้"$(printf '\t')"(เครื่องหมายคำพูดคู่เหล่านั้นจำเป็นต้องปิดการใช้งาน ตัวดำเนินการเนื่องจากอักขระแท็บยังเกิดขึ้นในค่าเริ่มต้นของ$IFS)


3
ฉันต้องทำcolumn -t -s $'\t'เพราะทุบตีดูเหมือนว่าจะ'\t'หมายถึงทั้ง\ และtแต่$'\t'หมายถึงแท็บที่แท้จริง Bash stinks
ThorSummoner

หากคุณต้องการ POSIC compliancy (โปรดช่วยฉันด้วย) โปรดดูคำตอบของฉันซึ่งขึ้นอยู่กับคำตอบที่ยอดเยี่ยมนี้อย่างมาก!
Nick Bull

วิธีนี้ใช้ได้ผลสำหรับฉัน - $'\t'แท็บทำให้เป็นตัวคั่น แต่ฉันค่อนข้างแน่ใจว่าฉันawk -F "\t"จะใช้แท็บเป็นตัวคั่นสำหรับ awk เหตุใดจึงใช้งานได้และไม่อยู่ที่นี่สำหรับคอลัมน์
Mike

3

ฉันใช้สิ่งต่อไปนี้ (ใช้ได้เฉพาะในกรณีที่ข้อความของคุณไม่มี|):

cat myfile | tr '\t' '|' | column -t -s '|'

สิ่งนี้จะแทนที่แท็บด้วยไพพ์จากนั้นใช้คอลัมน์ที่มีไพพ์เป็นตัวคั่น

(ฉันทำสิ่งนี้เพราะฉันไม่เห็นอะไรเลยในคำตอบของStéphaneที่ทำงานนอกกรอบในตู้ปลาไม่เช่นนั้นคำตอบของStéphaneก็ดูดี)


3

สำหรับ POSIX หรือ$'...'ที่รู้จักในชื่อ ANSI-C escaping ไม่ได้ถูกกำหนดไว้

คุณสามารถใช้$(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')สามารถใช้เป็น011(แทนแปดของทศนิยม 9) เป็นรหัส ANSI สำหรับอักขระแท็บแนวนอน:

column -t -s "$(printf '\011')"

อย่างไรก็ตามดูความเห็นด้านล่างจากStéphane Chazelas ว่าทำไมสิ่งนี้อาจไม่สอดคล้องกันในรุ่นของเชลล์


2
โปรดทราบว่า POSIX ไม่ได้ระบุการเข้ารหัสของ TAB ยังคงมีระบบ POSIX ที่การเข้ารหัสโลแคล C คือ EBCDIC โดยที่ TAB คือ 5 ไม่ใช่ 9 เหมือนใน ASCII หากเป็นไปได้ควรอ้างถึงตัวละครตามชื่อเพื่อหลีกเลี่ยงปัญหาเช่นนี้"$(printf '\t')"ตามที่ปรากฏในคำตอบของฉัน โปรดทราบว่า$'...'มีการวางแผนสำหรับการรวมไว้ในข้อมูลจำเพาะ POSIX เวอร์ชันถัดไป
Stéphane Chazelas

@ StéphaneChazelasเป็น$(printf '\t')POSIX หรือไม่ ขอขอบคุณ!
Nick Bull


@ StéphaneChazelasขอบคุณมากผมได้ปรับปรุงคำตอบของฉันที่จะรวมถึงเคล็ดลับของคุณที่เป็นประโยชน์มาก :)
นิคกระทิง

2

ใช้-tสำหรับเลือกจำนวนคอลัมน์ที่คุณต้องการ การปล่อยให้ว่างไว้นี้จะไม่เปลี่ยนแปลงอะไรเลย นอกจากนี้คุณยังต้องการพื้นที่สีขาวหลังจาก-sลองใช้:

cat myfile | column -s \t


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

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