Ausgabe in Spalten formatieren [bash, grep, sed, awk]

8

Guten Tag,

Ich habe mich gefragt, wie man die folgende Ausgabe formatiert:

%Vor%

in fünf Spalten, indem zuerst transponiert wird:

%Vor%

Vielen Dank im Voraus für jeden Vorschlag

BTW Mein erster Ansatz war: sed 's/\n//g' File | column -n

    
Another.Chemist 08.11.2013, 02:11
quelle

5 Antworten

24

Versuchen Sie Folgendes:

%Vor%     
traybold 08.11.2013, 02:30
quelle
6
___ antwort19851234 ___

Die Antwort von traybold mit printf "%14s %14s %14s %14s %14s\n" $(cat data.txt) und sollte wahrscheinlich verwendet werden, aber beachte, dass die letzte Zeile leer bis zur vollen Breite aufgefüllt ist. Auch wenn die Datendatei sehr groß ist (256 KiB vielleicht; fast sicher, bevor Sie 1 MiB erreichen), wird Ihnen der Platz für die Befehlszeilenargumente zu printf ausgehen. Die folgenden Lösungen funktionieren mit Dateien, die viele Megabyte groß sind, ohne das System zu beeinträchtigen.

Sie können pr im mehrspaltigen Modus fast verwenden ( pr -5 -l1 -t ), aber es macht die Spalten nicht richtig, so dass die - -Zeichen nicht korrekt dargestellt werden. OTOH, du könntest dann die Ausgabe in awk füttern, um die Rechtfertigung zu machen:

%Vor%

Aber wenn du awk in das Spiel ziehst, kann es auch die 'Transposition' für dich übernehmen - dazu braucht es allerdings ein bisschen mehr Code.

  

Dein Vorschlag funktioniert fast, aber wenn ich es versuche, bekomme ich: 0.8725220D- 0.1609633D- 0.2598447D- ; Der Exponent jeder Zahl ist weg.

Einige der Wunder von pr . Standardmäßig verwendet es Registerkarten, um Spalten zu trennen. Sie können dies mit -s' ' überschreiben oder indem Sie angeben, dass die Ausgabebreite breiter ist (z. B. -w100 ). Beachten Sie, dass Argumentwerte wie der Platz an die Option angehängt werden müssen, zumindest in traditionellen Implementierungen von pr (aber -w 100 funktioniert OK).

%Vor%

Alle diese pr | awk solutions leeren die letzte Zeile auf die volle Breite.

Hier sind zwei äquivalente awk -Skripts, die den Auftrag in einem Befehl ausführen. Man spreizt den Code über 2 Zeilen, der andere über 16 Zeilen (aber es ist einfacher zu lesen):

Option 1:

%Vor%

Option 2:

%Vor%

Die Ausgabe ist die gleiche wie zuvor, nur dass keines dieser Felder die letzte Zeile ausfüllt:

%Vor%

Es wäre einfacher und kürzer, Code zu schreiben, der das getan hat; Der Reset-Code würde auch delete a verwenden, um das Array zu löschen, und der END-Block würde einfach i testen und printf aus dem Hauptcode verwenden:

%Vor%     
___ answer19850574 ___

Versuchen Sie Folgendes:

%Vor%     
___ qstnhdr ___ Ausgabe in Spalten formatieren [bash, grep, sed, awk] ___ answer19850688 ___

Wow, habe das schon lange nicht mehr gesehen. Es gibt mehrere Möglichkeiten:

Der alte pr -Befehl wurde für diese Art von Arbeit verwendet - besonders, wenn Sie wollten, dass diese Spalten vertikal statt horizontal gehen.

Allerdings würde ich %code% verwenden, was mir erlaubt, den Text konstant zu halten und dann einen Zähler und den Modulo zu verwenden Operator zum Zählen, wenn ich fünf Elemente in einer Zeile habe. Der modulo Operator wird manchmal als Rest Operator bezeichnet. Es funktioniert jedoch wie eine Uhr:

%Vor%

Dem Format für %code% fehlt das Minus (d. h. %code% ), wodurch der Text rechts anstatt links ausgerichtet wird. Auf diese Weise wirft mich das Minus nicht ab.

    
___ answer19857064 ___
%Vor%

Beachten Sie, dass am Ende kein Zeilenumbruch eingefügt wird, wenn die Anzahl der Zeilen kein Vielfaches von 5 ist. Ist das ein Problem?

    
___ tag123awk ___ AWK ist eine interpretierte Programmiersprache, die für die Textverarbeitung entwickelt wurde und in der Regel als Datenextraktions- und Berichtswerkzeug verwendet wird. AWK wird weitgehend mit Unix-Systemen verwendet. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Programmierung mit AWK- oder AWK-basierten APIs bezieht. Fragen zur Verwendung oder zur Fehlerbehebung von AWK-Befehlszeilenoptionen selbst sind nicht Thema. ___ tag123sed ___ Sed (Stream EDitor) ist ein Befehlszeilen-Editor für die POSIX-Umgebung. Sed verarbeitet eine oder mehrere Dateien gemäß einem Editier-Skript und schreibt die Ergebnisse in die Standardausgabe. Es wurde in den Bell Labs entwickelt und existiert seit Mitte der 70er Jahre. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf das Programmieren mit sed- oder sed-basierten APIs bezieht. Fragen zur Verwendung oder Problembehandlung von sed-Befehlszeilenoptionen selbst sind nicht Thema. ___ tag123grep ___ grep ist ein Befehlszeilen-Textsuchprogramm, das ursprünglich für Unix geschrieben wurde. Es verwendet reguläre Ausdrücke für die Textübereinstimmung und wird häufig als Filter in Pipelines verwendet. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Programmierung mit grep- oder grep-basierten APIs bezieht. Fragen zur Verwendung oder Problembehandlung der Befehlszeilenoptionen von Grep selbst sind off-topic. ___ answer35624512 ___

Eine knifflige Alternative:

%Vor%

Verglichen mit dem @ traybold-Ansatz hat es den Nachteil, dass Elemente nummeriert sind (was nicht sein kann, was Sie wollen), aber es hat auch den Vorteil, die Anzahl der Spalten automatisch an die Eingabezeichenfolgen und die Terminalbreite anzupassen. p>     

___ tag123bash ___ Für Fragen zu Skripten, die für die Bash-Befehlsshell geschrieben wurden. Für Shell-Skripte mit Fehlern, überprüfen Sie diese bitte mit dem Shellcheck-Programm (oder im web-Shellcheck-Server unter https://shellcheck.net), bevor Sie hier posten. Fragen zur interaktiven Nutzung von Bash sind bei Super Usern eher Thema als bei Stack Overflow. ___ qstntxt ___

Guten Tag,

Ich habe mich gefragt, wie man die folgende Ausgabe formatiert:

%Vor%

in fünf Spalten, indem zuerst transponiert wird:

%Vor%

Vielen Dank im Voraus für jeden Vorschlag

BTW Mein erster Ansatz war: %code%

    
___
Jonathan Leffler 08.11.2013 03:44
quelle
0

Wow, habe das schon lange nicht mehr gesehen. Es gibt mehrere Möglichkeiten:

Der alte pr -Befehl wurde für diese Art von Arbeit verwendet - besonders, wenn Sie wollten, dass diese Spalten vertikal statt horizontal gehen.

Allerdings würde ich printf verwenden, was mir erlaubt, den Text konstant zu halten und dann einen Zähler und den Modulo zu verwenden Operator zum Zählen, wenn ich fünf Elemente in einer Zeile habe. Der modulo Operator wird manchmal als Rest Operator bezeichnet. Es funktioniert jedoch wie eine Uhr:

%Vor%

Dem Format für printf fehlt das Minus (d. h. %-14.14s ), wodurch der Text rechts anstatt links ausgerichtet wird. Auf diese Weise wirft mich das Minus nicht ab.

    
David W. 08.11.2013 02:43
quelle
0
%Vor%

Beachten Sie, dass am Ende kein Zeilenumbruch eingefügt wird, wenn die Anzahl der Zeilen kein Vielfaches von 5 ist. Ist das ein Problem?

    
Ed Morton 08.11.2013 10:44
quelle
0

Eine knifflige Alternative:

%Vor%

Verglichen mit dem @ traybold-Ansatz hat es den Nachteil, dass Elemente nummeriert sind (was nicht sein kann, was Sie wollen), aber es hat auch den Vorteil, die Anzahl der Spalten automatisch an die Eingabezeichenfolgen und die Terminalbreite anzupassen. p>     

bitifet 25.02.2016 10:22
quelle

Tags und Links