Ich bearbeite eine einfache Tabelle. Ich hätte es gerne schön formatiert. Während ich verwenden könnte tbl
, latex
oder ähnliche, dies scheint übertrieben - Klartext wirklich ausreichend ist. Da es einfach ist, könnte ich genauso gut die Quelle als Ausgabe haben. Die Quelle sollte also auch gut aussehen. Dies scheint ein perfekter Job zu sein column -s '|' -t
- es findet die Trennzeichen und fügt automatisch Leerzeichen ein, um sie entsprechend der maximalen Breite in jeder Spalte auszurichten. Leider werden die Trennzeichen gelöscht, sodass ich sie nach der weiteren Bearbeitung nicht erneut ausführen kann. Gibt es ein gutes Textverarbeitungswerkzeug, das dies idempotent ausführen kann, sodass die Ausgabe als Eingabe dient? Oder muss ich meine eigene schreiben?
BEARBEITEN: Hier ist ein Beispiel für das, was ich will:
foo | bar | baz
abc def | 12 | 23456
soll werden
foo | bar | baz
abc def | 12 | 3456
Wann ' '
ist sowohl der Separator und der Spacer, column -t
funktioniert gut. Aber meine Gegenstände haben Leerzeichen, deshalb kann ich das nicht verwenden. Es erschwert die Sache, wenn die Abstandshalter von den Abstandshaltern verschieden sind. Ich denke, es ist nützlich, sie als Trennzeichen neben Trennzeichen zu behandeln, aber das ist nicht das, was es column -s '|' -t
tut (obwohl das aktuelle Verhalten natürlich auch nützlich ist).
quelle
printf
Holocaust jedes Mal zu umgehen , die ich bisher gefunden habe, besteht darin,@
den Daten einen eindeutigen Buchstaben ("like" ) hinzuzufügen und... | column -s@ -t
anschließend zu verwenden.Antworten:
Ich bin mir nicht sicher, ob ich richtig verstanden habe, was dein Problem ist. Aber kann es durch Hinzufügen eines zusätzlichen zeitlichen Trennzeichens gelöst werden? Daher können Sie das zweite Trennzeichen verwenden, um die Separationen zu markieren, wobei das ursprüngliche Trennzeichen unverändert bleibt.
In diesem Beispiel füge ich jedem "|" ein "@" hinzu. Die Eingabe des Spaltenbefehls wäre also "xxx @ | yyyy". Die Spalte verarbeitet das "@", wobei das "|" unberührt:
quelle
sed 's/ *| */@| /g'
stattdessensed 's/ |/|/g'
nach dencolumn
reparaturen die zusätzlichen spalte hinzugefügt. Wir haben jetzt eine Lösung, die für mich gut genug funktioniert. (Obwohl es schön wäre, wenn es nicht auf einen zusätzlichen Charakter wie diesenDies war nicht verfügbar, als Sie die Frage stellten, aber ab Version 2.23
column
vonutil-linux
können Sie das Ausgangstrennzeichen über auswählenAlso einfach ausführen:
quelle
util-linux
Version zum Zeitpunkt des Schreibens nicht auf Ubuntu 18.04 (und wahrscheinlich anderen von Debain abgeleiteten Distributionen) verfügbar ist. Nur diebsdmainutils
Version ist verfügbar. Diebsdmainutils
Version unterstützt keine Ausgabeformatierung.Hier ist ein Bash-Skript. "Column -t" wird nicht verwendet, und das Trennzeichen wird genauso behandelt wie das IFS, da es sich um das IFS handelt (oder zumindest um die interne Version des IFS von awk) ... Das Standardtrennzeichen ist $ '\ t'.
Dieses Skript füllt das Feld ganz rechts vollständig aus.
'column' macht das nicht.
Durch Ausfüllen aller Spalten kann dieses Skript
problemlos geändert werden, um auch einen Tabellenrahmen zu erstellen.
Hinweis. Die Eingabedatei muss zweimal verarbeitet werden
(dies müsste auch für 'column' durchgeführt werden).
Der erste Durchgang besteht darin, die maximalen Spaltenbreiten zu ermitteln.
Der zweite Durchgang ist das Erweitern von Feldern (pro Spalte)
Einige Optionen hinzugefügt und ein eklatanter Fehler behoben (Umbenennen von Variablen :(
quelle
Schauen Sie sich das Vim-Plugin namens Tabularize an
quelle
Dies ist eine zweigängige Änderung der Antwort von hmontoliu , mit der vermieden wird, dass der Begrenzer hart codiert werden muss , indem er aus den Eingabedaten erraten wird.
$d
.@
gemäß PeterOs Kommentar.Der Code ist eine Funktion, die einen Dateinamen oder eine Eingabe von STDIN akzeptiert :
Ausgabe von
algn foo
(oder auchalgn < foo
):quelle
Benutzte Idee von hmontoliu , um einfachen Befehl zu implementieren:
Kommentar:
${1:-,}
- ist ein erstes Argument mit,
der Voreinstellungsed
fügt ein Zwischensymbol ein ($interm
2. Argument oder~
standardmäßig)column
Ersetzt dann das Zwischensymbol durch Leerzeichen, die ausgerichtet werdensed
Option bereinigt die redundanten Leerzeichen nach demcolumn
BefehlAnwendungsbeispiel:
Das ist auch insofern gut, als es idempotent ist: Sie können es mehrmals anwenden und das gleiche Ergebnis erzielen (zum Beispiel, wenn Sie in vim bearbeiten und neu ausrichten).
quelle