¿Puedo formatear posteriormente los tamaños de las pestañas de las columnas para que el espaciado sea el mínimo común denominador en Linux?

¿Puedo formatear posteriormente los tamaños de las pestañas de las columnas para que el espaciado sea el mínimo común denominador en Linux?

Puedo usarlo statpara crear una salida ls que muestre ambos formatos de información de permisos, lo cual puede ser útil:

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

Sin embargo, el espacio entre columnas \testá bien, pero es bastante "espacioso". Esto me hizo sentir curiosidad: ¿existe una forma genérica de posprocesar resultados como este de modo que las columnas estén en el mínimo común denominador de espacios de un espacio? Es decir, ¿existe una forma genérica de ajustar lo anterior a algo como lo siguiente? usando awko sedo similar (también estoy justificando a la derecha solo las columnas numéricas como una salida "ideal", si es posible)?

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

Respuesta1

Con respecto a "o sed" en su pregunta: sed es la herramienta adecuada para usar en transformaciones simples s/old/new/ en cadenas individuales, lo que está haciendo no es nada de eso y, por lo tanto, sed ni siquiera debería ser una opción para considerar.

Usando un enfoque de 2 pasos, primero para determinar el ancho máximo y la alineación de cada columna y luego usarlos al imprimir, usando cualquier awk en cualquier shell en cada cuadro de Unix:

$ 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

Lo anterior supone que su última columna siempre estará alineada a la izquierda; si ese no es el caso, háganoslo saber, ya que no es difícil de manejar de cualquier manera. También supone que la alineación de una columna puede determinarse mediante los valores (numéricos o no) en los campos de la última línea de entrada.

Si la entrada tiene que provenir de una tubería en lugar de un archivo (por lo que no puede abrir la entrada dos veces), entonces puede almacenar la entrada en una matriz e imprimirla en la sección FINAL:

$ 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]
    }
}

y luego llamarlo como:

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

Respuesta2

Puedes usar column -t your_file(pero, hasta donde yo sé, no obtiene el bit justificado correcto)

Salidas:

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

información relacionada