Pembaruan : Ini dia skrip yang lebih sederhana (yang ada di akhir pertanyaan) untuk hasil tabulasi. Hanya lulus nama file untuk itu seperti yang Anda lakukan untuk paste
... Menggunakan html
untuk membuat frame, sehingga sangat tweakable. Itu memang melestarikan banyak ruang, dan perataan kolom dipertahankan ketika bertemu karakter unicode. Namun, cara editor atau pemirsa merender unicode adalah masalah lain sepenuhnya ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Sinopsis alat yang disajikan dalam jawaban (sejauh ini).
Saya sudah cukup dekat melihat mereka; inilah yang saya temukan:
paste
# Alat ini umum untuk semua jawaban yang disajikan sejauh ini # Dapat menangani banyak file; karena itu banyak kolom ... Bagus! # Ini membatasi setiap kolom dengan Tab ... Bagus. # Outputnya tidak ditabulasi.
Semua alat di bawah ini menghapus pembatas ini! ... Buruk jika Anda membutuhkan pembatas.
column
# Ini menghilangkan pembatas Tab, jadi pengidentifikasi bidang adalah murni oleh kolom yang tampaknya menangani dengan sangat baik .. Saya belum melihat sesuatu yang serba salah ... # Selain tidak memiliki pembatas yang unik, berfungsi dengan baik!
expand
# Hanya memiliki pengaturan tab tunggal, sehingga tidak dapat diprediksi melebihi 2 kolom # Penjajaran kolom tidak akurat saat menangani unicode, dan menghapus pembatas Tab, jadi identifikasi bidang murni oleh perataan kolom
pr
# Hanya memiliki pengaturan satu tab, sehingga tidak dapat diprediksi melebihi 2 kolom. # Penjajaran kolom tidak akurat saat menangani unicode, dan menghapus pembatas Tab, jadi identifikasi bidang murni oleh perataan kolom
Bagi saya, column
ini solusi terbaik yang jelas sebagai one-liner .. Anda ingin pembatas, atau tabluasi ASCII-art dari file Anda, baca terus, jika tidak .. columns
sangat bagus :) ...
Berikut ini adalah skrip yang mengambil numper file apa pun dan membuat presentasi tabulasi ASCII-art .. (Ingatlah bahwa unicode mungkin tidak merender sesuai lebar yang diharapkan, mis. ௵ yang merupakan karakter tunggal. Ini sangat berbeda dengan kolom nomor menjadi salah, seperti halnya pada beberapa utilitas yang disebutkan di atas.) ... Keluaran skrip, yang ditunjukkan di bawah, berasal dari 4 file input, bernama 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
Inilah jawaban asli saya (dipangkas sedikit sebagai pengganti skrip di atas)
Menggunakan wc
untuk mendapatkan lebar kolom, dan sed
ke kanan pad dengan karakter yang terlihat.
(hanya untuk contoh ini) ... dan kemudian paste
untuk bergabung dengan dua kolom dengan karakter Tab ...
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
Jika Anda ingin mengisi kolom kanan:
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...........