Wie spalte ich eine Liste von Elementen mit minimaler Breite?

7

Wie spalte ich nicht kolumnierte Eingaben wie lsfolgt ein?

ls erstellt eine optimierte Tabelle mit einer Mindestbreite für jede Zeile, zum Beispiel:

ls

2  dsao  file with space  with
5  e     g                wsdl-rubo-6cb0f1a9086e80c
d  file   leading space

Wenn ich jedoch eine Ausgabe einspeise column(z. B. jede Datei in einer Zeile), wird jede Zeile mit der gleichen Breite aufgefüllt, sodass sie zur Bildschirmbreite passt:

for i in *; do echo "$i"; done | column

2                               file with space                          
5                               g                                        
d                                leading space                           
dsao                            with                                     
e                               wsdl-rubo-6cb0f1a9086e80c                
file

(Ich verwende hier nur die Dateiliste, um die gleiche Ausgabe wie im Beispiel zu generieren. Ich suche nach einer solchen Lösung, um am Ende andere Dinge zu kolumnieren.)

Wie kann ich eine Ausgabe mit einer variablen Spaltenbreite kolunisieren?

rubo77
quelle
Okay, eine alternative Lesart Ihrer Anfrage wäre, wenn ich Ihre Kommentare richtig verstehe, "die Eingabe wie column -c_ n-x " zu spalten, aber die Ausgabe in so wenige Bildschirmspalten wie möglich einzupassen, anstatt die angegebene Breite auszufüllen ". Ist das richtig?
Bis
ja fast: zusätzlich sollten möglichst viele spalten entstehen, die in den bildschirm passen. (wie es lsschafft). Vielleicht finden wir die Lösung, wenn wir uns den Quellcode des Quellcode des lsBefehls in coreutils
ansehen

Antworten:

5

Danke @ rubo77, dass du das gefragt hast, es ist eine großartige Übung. Für mich war es ein Fehler, was Englisch ist. Tough Stuff ist ein verpatzter Rhythmus: Es hat Spaß gemacht, schnell, obwohl der Algorithmus selbst hier ziemlich einfach ist.

[endgültige Bearbeitung: verschoben nach https://github.com/jthill/columnate/blob/master/columnate , Fehler behoben, Zeilenmajor implementiert. ]]

jthill
quelle
auch du solltest das auf github setzen. Wenn es schneller als der ls-Algorithmus ist, können Sie vielleicht ein schnelleres ls-util erstellen?
Rubo77
@ rubo77 Du musst ihm die Variable COLUMNS geben. Siehe den Kommentar 'Test mit' im Code. Und das 10x-20x ist umgekehrt, es ist langsamer, hauptsächlich weil es awk gegen C ist
bis
time ls | sort | columnate COLUMNS=$COLUMNS
Bis
Du bist ein Genie. Dies muss für jede Linux-Distribution veröffentlicht werden
rubo77
eh, danke wirklich, aber das ist zu stark. Lesen Sie den Code, es ist fast Brute-Force
bis
3

Etwas in der Nähe der Ausgabe von ls:

for i in *; do echo -en "${i}\t"; done; echo
Radu Rădeanu
quelle
schön, es springt nur in Reihe, wenn die Eingabezeilen mehr als eine Registerkarte in der Breite variieren. Gibt es eine Möglichkeit, eine Unterbrechung der Ausgabe auf der rechten Fensterseite zu verhindern?
Rubo77