Kann ich die Tabulatorgrößen der Spalten nachträglich so formatieren, dass der Abstand in Linux dem kleinsten gemeinsamen Nenner entspricht?

Kann ich die Tabulatorgrößen der Spalten nachträglich so formatieren, dass der Abstand in Linux dem kleinsten gemeinsamen Nenner entspricht?

Ich kann es verwenden, statum eine ls-Ausgabe zu erstellen, die beide Formate der Berechtigungsinformationen anzeigt, was praktisch sein kann:

stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .*

drwxr-xr-x      755     4       boss    boss    4096    2021-10-29 22:49:12     .
drwxr-xr-x      755     4       boss    boss    4096    2021-10-29 22:49:12     .
drwxr-xr-x      755     36      boss    boss    4096    2021-11-01 11:30:24     ..
-rw-r--r--      644     1       boss    boss    97708   2021-11-01 11:30:16     .custom
-rw-r--r--      644     1       boss    boss    4013    2021-10-11 22:04:04     .custom-dk

Der Abstand zwischen den Spalten \tist jedoch in Ordnung, aber recht „lückenhaft“. Das hat mich neugierig gemacht: Gibt es eine allgemeine Möglichkeit, Ausgaben wie diese nachzubearbeiten, sodass die Spalten den kleinsten gemeinsamen Nenner von Lücken von einem Leerzeichen haben, d. h. gibt es eine allgemeine Möglichkeit, das Obige mithilfe von awkoder sedoder Ähnlichem in etwas wie das Folgende anzupassen (ich richte auch nur die Zahlenspalten rechtsbündig aus, als „ideale“ Ausgabe, wenn das möglich ist)?

drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss  4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644  1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644  1 boss boss  4013 2021-10-11 22:04:04 .custom-dk

Antwort1

Bezüglich „oder sed“ in Ihrer Frage: „sed“ ist das richtige Tool für einfache s/alt/neu/-Transformationen einzelner Zeichenfolgen, was Sie tun, ist jedoch nichts dergleichen und daher sollte „sed“ nicht einmal eine in Betracht zu ziehende Option sein.

Verwenden Sie einen 2-Pass-Ansatz, um zuerst die maximale Breite und Ausrichtung für jede Spalte zu bestimmen und diese dann beim Drucken zu verwenden. Verwenden Sie dazu ein beliebiges awk in einer beliebigen Shell auf jeder Unix-Box:

$ cat tst.awk
BEGIN { FS="\t" }
NR==FNR {
    for (i=1; i<=NF; i++) {
        align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
        width[i] = ( length($i) > width[i] ? length($i) : width[i] )
    }
    next
}
{
    for (i=1; i<NF; i++) {
        printf "%" align[i] width[i] "s ", $i
    }
    print $NF
}

$ awk -f tst.awk file file
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755  4 boss boss  4096 2021-10-29 22:49:12 .
drwxr-xr-x 755 36 boss boss  4096 2021-11-01 11:30:24 ..
-rw-r--r-- 644  1 boss boss 97708 2021-11-01 11:30:16 .custom
-rw-r--r-- 644  1 boss boss  4013 2021-10-11 22:04:04 .custom-dk

Das Obige geht davon aus, dass Ihre letzte Spalte immer linksbündig ausgerichtet sein soll. Wenn das nicht der Fall ist, lassen Sie es uns wissen, da es in beiden Fällen nicht schwer zu handhaben ist. Es wird auch davon ausgegangen, dass die Ausrichtung einer Spalte durch die Werte (numerisch oder nicht) in den Feldern in der letzten Eingabezeile bestimmt werden kann.

Wenn die Eingabe aus einer Pipe statt aus einer Datei kommen muss (und Sie die Eingabe daher nicht zweimal öffnen können), können Sie die Eingabe in einem Array speichern und dieses im Abschnitt END ausgeben:

$ cat tst.awk
BEGIN { FS = "\t" }
{
    for (i=1; i<=NF; i++) {
        width[i] = ( length($i) > width[i] ? length($i) : width[i] )
        align[i] = ( $i ~ /^[0-9]+$/ ? "" : "-" )
        vals[NR,i] = $i
    }
}
END {
    for (n=1; n<=NR; n++) {
        for (i=1; i<NF; i++) {
            printf "%" align[i] width[i] "s ", vals[n,i]
        }
        print vals[n,NF]
    }
}

und rufen Sie es dann so auf:

$ stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" . .* | awk -f tst.awk

Antwort2

Sie können verwenden column -t your_file(aber es wird nicht der richtige Blocksatz angezeigt, soweit ich das beurteilen kann)

Ausgaben:

drwxr-xr-x  755  4   boss  boss  4096   2021-10-29  22:49:12  .
drwxr-xr-x  755  4   boss  boss  4096   2021-10-29  22:49:12  .
drwxr-xr-x  755  36  boss  boss  4096   2021-11-01  11:30:24  ..
-rw-r--r--  644  1   boss  boss  97708  2021-11-01  11:30:16  .custom
-rw-r--r--  644  1   boss  boss  4013   2021-10-11  22:04:04  .custom-dk

verwandte Informationen