Update : Hier ist ein viel einfacheres Skript (das am Ende der Frage) für die tabellarische Ausgabe. Übergeben paste
Sie einfach den Dateinamen wie html
gewohnt ... Der Frame wird so erstellt, dass er angepasst werden kann. Es werden mehrere Leerzeichen beibehalten, und die Spaltenausrichtung wird beibehalten, wenn Unicode-Zeichen gefunden werden. Die Art und Weise, wie der Editor oder der Betrachter den Unicode rendert, ist jedoch eine ganz andere Sache ...
┌──────────────────────┬────────────────┬──────────┬────────────────────────────┐
│ 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'
---
Eine Übersicht über die in den Antworten vorgestellten Tools (bisher).
Ich habe sie mir ziemlich genau angesehen. Folgendes habe ich gefunden:
paste
# Dieses Tool ist allen bisher vorgestellten Antworten gemeinsam. # Es kann mehrere Dateien verarbeiten. daher mehrere Spalten ... Gut! # Es begrenzt jede Spalte mit einem Tabulator ... Gut. # Die Ausgabe ist nicht tabellarisch.
Alle folgenden Tools entfernen dieses Trennzeichen! ... Schlecht, wenn Sie ein Trennzeichen benötigen.
column
# Es entfernt das Tab-Trennzeichen, so dass die Feldidentifizierung nur durch Spalten erfolgt, die es anscheinend recht gut handhabt. Ich habe nichts Falsches entdeckt ... # Abgesehen davon, dass es kein eindeutiges Trennzeichen gibt, funktioniert es einwandfrei!
expand
# Hat nur eine Tabulatoreinstellung, ist also über 2 Spalten hinaus unvorhersehbar
pr
# Verfügt nur über eine einzige Tabulatoreinstellung, so dass eine Überschreitung von 2 Spalten nicht vorhersehbar ist. # Die Ausrichtung der Spalten ist bei der Verarbeitung von Unicode nicht korrekt. Das Tabulator-Trennzeichen wird entfernt, sodass die Feldidentifizierung ausschließlich durch die Spaltenausrichtung erfolgt
Für mich ist column
es die offensichtlich beste Lösung als Einzeiler. Wenn Sie entweder das Trennzeichen oder eine ASCII-artige Tabellierung Ihrer Dateien wünschen, lesen Sie weiter, ansonsten columns
ist es verdammt gut :) ...
Hier ist ein Skript, das eine beliebige Anzahl von Dateien aufnimmt und eine tabellarische ASCII-Darstellung erstellt. (Beachten Sie, dass Unicode möglicherweise nicht die erwartete Breite aufweist, z. B. eg, das ein einzelnes Zeichen ist. Dies unterscheidet sich erheblich von der Spalte Zahlen sind falsch, wie es bei einigen der oben genannten Dienstprogramme der Fall ist.) ... Die unten gezeigte Ausgabe des Skripts stammt aus 4 Eingabedateien mit dem Namen 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
Hier ist meine ursprüngliche Antwort (anstelle des obigen Skripts etwas gekürzt)
Verwenden Sie wc
, um die Spaltenbreite zu ermitteln und sed
das rechte Feld mit einem sichtbaren Zeichen zu versehen .
(nur für dieses Beispiel) ... und dann paste
, um die beiden Spalten mit einem Tabulatorzeichen zu verbinden ...
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
Wenn Sie die rechte Spalte ausfüllen möchten:
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...........