Posso pós-formatar os tamanhos das guias das colunas para que o espaçamento seja o menor denominador comum no Linux?

Posso pós-formatar os tamanhos das guias das colunas para que o espaçamento seja o menor denominador comum no Linux?

Posso usar statpara criar uma saída ls que mostra os dois formatos de informações de permissão que podem ser úteis:

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

No entanto, o espaçamento entre colunas \té bom, mas bastante 'lacuna'. Isso me deixou curioso, existe uma maneira genérica de pós-processar quaisquer saídas como essa, de modo que as colunas fiquem no menor denominador comum de lacunas de um espaço, ou seja, existe uma maneira genérica de ajustar o acima para algo como o abaixo usando awkou sedsimilar (também estou justificando à direita apenas as colunas numéricas como uma saída 'ideal', se isso for possível)?

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

Responder1

Com relação a "ou sed" na sua pergunta - sed é a ferramenta certa para usar para transformações simples s/old/new/ em strings individuais, o que você está fazendo não é nada parecido e então sed nem deveria ser uma opção para considerar.

Usando uma abordagem de 2 passagens, primeiro para determinar a largura máxima e o alinhamento de cada coluna e depois usá-los ao imprimir, usando qualquer awk em qualquer shell em cada caixa 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

O texto acima pressupõe que sua última coluna deve estar sempre alinhada à esquerda; se esse não for o caso, avise-nos, pois não é difícil lidar com isso de qualquer maneira. Também assume que o alinhamento de uma coluna pode ser determinado pelos valores (numéricos ou não) nos campos da última linha de entrada.

Se a entrada tiver que vir de um canal em vez de um arquivo (e você não pode abrir a entrada duas vezes), você pode armazenar a entrada em um array e imprimi-la na seção END:

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

e então chame-o como:

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

Responder2

Você pode usar column -t your_file(mas não obtém a parte justificada correta, até onde eu sei)

Saídas:

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

informação relacionada