อัปเดต : นี่เป็นสคริปต์ที่ง่ายกว่ามาก (สำหรับสคริปต์สุดท้าย) เพียงแค่ผ่านชื่อไฟล์ตามที่คุณต้องการpaste
... มันใช้html
ในการทำเฟรมดังนั้นมันจึงปรับแต่งได้ มันจะรักษาหลายช่องว่างและการจัดตำแหน่งคอลัมน์จะถูกเก็บไว้เมื่อพบตัวอักษรยูนิโค้ด อย่างไรก็ตามวิธีที่ผู้แก้ไขหรือผู้ดูเรนเดอร์แสดงยูนิโค้ดเป็นอีกเรื่องหนึ่งโดยสิ้นเชิง ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ Languages │ Minimal │ Chomsky │ Unrestricted │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Recursive │ Turing machine │ Finite │ space indented │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ Regular │ Grammars │ │ ➀ unicode may render oddly │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ 1 2 3 4 spaces │ │ Symbol-& │ but the column count is ok │
├──────────────────────┼────────────────┼──────────┼────────────────────────────┤
│ │ │ │ Context │
└──────────────────────┴────────────────┴──────────┴────────────────────────────┘
#!/bin/bash
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
paste "$@" |sed -re 's#(.*)#\x09\1\x09#' -e 's#\x09# </pre></td>\n<td><pre> #g' -e 's#^ </pre></td>#<tr>#' -e 's#\n<td><pre> $#\n</tr>#'
echo -e "</table>\n</html>"
} |w3m -dump -T 'text/html'
---
บทสรุปของเครื่องมือที่นำเสนอในคำตอบ (จนถึงตอนนี้)
ฉันได้ดูพวกเขาอย่างใกล้ชิด นี่คือสิ่งที่ฉันได้พบ:
paste
# เครื่องมือนี้เป็นเรื่องธรรมดาสำหรับทุกคำตอบที่นำเสนอ # มันสามารถจัดการไฟล์ได้หลายไฟล์ ดังนั้นจึงมีหลายคอลัมน์ ... ดีมาก! # มันคั่นแต่ละคอลัมน์ด้วยแท็บ ... ดี # เอาต์พุตไม่ได้ถูกทำเป็นตาราง
เครื่องมือทั้งหมดด้านล่างทั้งหมดลบตัวคั่นนี้! ... ไม่ดีถ้าคุณต้องการตัวคั่น
column
# มันลบตัวคั่นของแท็บดังนั้นตัวระบุฟิลด์จะบริสุทธิ์โดยคอลัมน์ที่ดูเหมือนว่าจะจัดการค่อนข้างดี .. ฉันไม่ได้เห็นอะไรผิดพลาด ... # นอกเหนือจากการไม่มีตัวคั่นที่ไม่ซ้ำกันมันทำงานได้ดี!
expand
# มีการตั้งค่าแท็บเดียวเท่านั้นจึงไม่สามารถคาดเดาได้เกินกว่า 2 คอลัมน์ # การจัดเรียงคอลัมน์ไม่ถูกต้องเมื่อจัดการยูนิโค้ดและลบตัวคั่นของแท็บดังนั้นตัวระบุฟิลด์จะบริสุทธิ์โดยการจัดเรียงคอลัมน์
pr
# มีการตั้งค่าแท็บเดียวเท่านั้นจึงไม่สามารถคาดเดาได้เกิน 2 คอลัมน์ # การจัดตำแหน่งคอลัมน์ไม่ถูกต้องเมื่อจัดการยูนิโค้ดและจะลบตัวคั่นแท็บดังนั้นการระบุฟิลด์จะเป็นการจำแนกคอลัมน์อย่างหมดจด
สำหรับฉันcolumn
มันเป็นโซลูตรอนที่ดีที่สุดอย่างเห็นได้ชัดในฐานะหนึ่งซับ .. คุณต้องการทั้งตัวคั่นหรือแท็บ tabluation ASCII - art ของไฟล์ของคุณอ่านใน .. มิฉะนั้น .. columns
ค่อนข้างดี:)
นี่คือสคริปต์ที่ใช้งานไฟล์ใด ๆ และสร้างงานนำเสนอแบบแท็บ ASCII-art .. (จำไว้ว่ายูนิโค้ดอาจไม่แสดงผลตามความกว้างที่คาดไว้เช่น. ௵ซึ่งเป็นอักขระตัวเดียวซึ่งค่อนข้างแตกต่างจากคอลัมน์ ตัวเลขผิดเช่นในกรณีของยูทิลิตี้ที่กล่าวถึงข้างต้น) ... เอาต์พุตของสคริปต์ที่แสดงด้านล่างมาจากไฟล์อินพุต 4 ไฟล์ชื่อ F1 F2 F3 F4 ...
+------------------------+-------------------+-------------------+--------------+
| Languages | Minimal automaton | Chomsky hierarchy | Grammars |
| Recursively enumerable | Turing machine | Type-0 | Unrestricted |
| Regular | Finite | — | |
| Alphabet | | Symbol | |
| | | | Context |
+------------------------+-------------------+-------------------+--------------+
#!/bin/bash
# Note: The next line is for testing purposes only!
set F1 F2 F3 F4 # Simulate commandline filename args $1 $2 etc...
p=' ' # The pad character
# Get line and column stats
cc=${#@}; lmax= # Count of columns (== input files)
for c in $(seq 1 $cc) ;do # Filenames from the commandline
F[$c]="${!c}"
wc=($(wc -l -L <${F[$c]})) # File length and width of longest line
l[$c]=${wc[0]} # File length (per file)
L[$c]=${wc[1]} # Longest line (per file)
((lmax<${l[$c]})) && lmax=${l[$c]} # Length of longest file
done
# Determine line-count deficits of shorter files
for c in $(seq 1 $cc) ;do
((${l[$c]}<lmax)) && D[$c]=$((lmax-${l[$c]})) || D[$c]=0
done
# Build '\n' strings to cater for short-file deficits
for c in $(seq 1 $cc) ;do
for n in $(seq 1 ${D[$c]}) ;do
N[$c]=${N[$c]}$'\n'
done
done
# Build the command to suit the number of input files
source=$(mktemp)
>"$source" echo 'paste \'
for c in $(seq 1 $cc) ;do
((${L[$c]}==0)) && e="x" || e=":a -e \"s/^.{0,$((${L[$c]}-1))}$/&$p/;ta\""
>>"$source" echo '<(sed -re '"$e"' <(cat "${F['$c']}"; echo -n "${N['$c']}")) \'
done
# include the ASCII-art Table framework
>>"$source" echo ' | sed -e "s/.*/| & |/" -e "s/\t/ | /g" \' # Add vertical frame lines
>>"$source" echo ' | sed -re "1 {h;s/[^|]/-/g;s/\|/+/g;p;g}" \' # Add top and botom frame lines
>>"$source" echo ' -e "$ {p;s/[^|]/-/g;s/\|/+/g}"'
>>"$source" echo
# Run the code
source "$source"
rm "$source"
exit
นี่คือคำตอบเดิมของฉัน (ตัดแต่งเล็กน้อยแทนสคริปต์ด้านบน)
ใช้wc
เพื่อรับความกว้างคอลัมน์และsed
ไปทางขวาด้วยอักขระที่มองเห็นได้.
(สำหรับตัวอย่างนี้) ... จากนั้นpaste
เข้าร่วมสองคอลัมน์ด้วยแท็บ char ...
paste <(sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1) F2
# output (No trailing whitespace)
Languages............. Minimal automaton
Recursively enumerable Turing machine
Regular............... Finite
หากคุณต้องการแยกคอลัมน์ขวาออก:
paste <( sed -re :a -e 's/^.{1,'"$(($(wc -L <F1)-1))"'}$/&./;ta' F1 ) \
<( sed -re :a -e 's/^.{1,'"$(($(wc -L <F2)-1))"'}$/&./;ta' F2 )
# output (With trailing whitespace)
Languages............. Minimal automaton
Recursively enumerable Turing machine...
Regular............... Finite...........