Cập nhật : Ở đây tôi là một tập lệnh đơn giản hơn nhiều (tập lệnh ở cuối câu hỏi) cho đầu ra được lập bảng. Chỉ cần truyền tên tệp cho nó như bạn muốn paste
... Nó sử dụng html
để tạo khung, vì vậy nó có thể điều chỉnh được. Nó bảo tồn nhiều khoảng trắng và căn chỉnh cột được giữ nguyên khi gặp các ký tự unicode. Tuy nhiên, cách trình soạn thảo hoặc trình xem kết xuất unicode lại là một vấn đề khác hoàn toàn ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Một bản tóm tắt của các công cụ được trình bày trong các câu trả lời (cho đến nay).
Tôi đã có một cái nhìn khá gần với họ; đây là những gì tôi đã tìm thấy:
paste
# Công cụ này phổ biến cho tất cả các câu trả lời được trình bày cho đến nay # Nó có thể xử lý nhiều tệp; do đó nhiều cột ... Tốt! # Nó phân định từng cột bằng một Tab ... Tốt. # Đầu ra của nó không được lập bảng.
Tất cả các công cụ dưới đây đều loại bỏ dấu phân cách này! ... Xấu nếu bạn cần một dấu phân cách.
column
# Nó loại bỏ dấu phân cách Tab, do đó, nhận dạng trường hoàn toàn bằng các cột mà nó dường như xử lý khá tốt .. Tôi không phát hiện ra bất cứ điều gì tồi tệ ... # Ngoài việc không có một dấu phân cách duy nhất, nó hoạt động tốt!
expand
# Chỉ có một cài đặt tab duy nhất, do đó không thể đoán trước ngoài 2 cột # Việc căn chỉnh các cột không chính xác khi xử lý unicode và nó loại bỏ dấu phân cách Tab, do đó, nhận dạng trường hoàn toàn bằng cách căn chỉnh cột
pr
# Chỉ có một cài đặt tab duy nhất, vì vậy không thể đoán trước ngoài 2 cột. # Căn chỉnh các cột không chính xác khi xử lý unicode và nó loại bỏ dấu phân cách Tab, do đó, nhận dạng trường hoàn toàn bằng căn chỉnh cột
Đối với tôi, column
đó là soluton rõ ràng nhất với tư cách là một lớp lót .. Bạn muốn hoặc là dấu phân cách hoặc một biểu đồ nghệ thuật ASCII của các tệp của bạn, đọc, nếu không .. columns
là khá tốt :) ...
Đây là một tập lệnh lấy bất kỳ số tập tin nào và tạo một bản trình bày được lập bảng theo nghệ thuật ASCII .. (Hãy nhớ rằng unicode có thể không hiển thị theo chiều rộng dự kiến, ví dụ: là một ký tự đơn. Điều này khá khác với cột các số bị sai, như trường hợp trong một số tiện ích được đề cập ở trên.) ... Đầu ra của tập lệnh, được hiển thị bên dưới, là từ 4 tệp đầu vào, được đặt tên là 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
Đây là câu trả lời ban đầu của tôi (cắt bớt một chút thay cho kịch bản trên)
Sử dụng wc
để có được độ rộng cột, và sed
để pad đúng với một có thể nhìn thấy nhân vật .
(chỉ dành riêng cho ví dụ này) ... và sau đó paste
tham gia hai cột với một Tab 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
Nếu bạn muốn điền vào cột bên phải:
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...........