Можно ли отформатировать размеры табуляции столбцов таким образом, чтобы интервалы были наименьшими по величине в Linux?

Можно ли отформатировать размеры табуляции столбцов таким образом, чтобы интервалы были наименьшими по величине в Linux?

Я могу использовать его statдля создания вывода ls, который показывает оба формата информации о разрешениях, что может быть удобно:

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

Однако интервал между столбцами использует , \tчто нормально, но довольно 'зазорно'. Это заставило меня полюбопытствовать, есть ли универсальный способ постобработки любых выходных данных, таких как этот, так, чтобы столбцы были в наименьшем общем знаменателе зазоров в один пробел, т. е. есть ли универсальный способ скорректировать вышесказанное до чего-то вроде нижесказанного, используя awkили sedили подобное (я также выравниваю по правому краю только количество столбцов как 'идеальный' выходной сигнал, если это возможно)?

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

решение1

Что касается «или sed» в вашем вопросе, sed — это правильный инструмент для простых преобразований s/old/new/ в отдельных строках, то, что вы делаете, совсем не похоже на это, поэтому sed даже не следует рассматривать как вариант.

Используя двухпроходный подход, сначала определяем максимальную ширину и выравнивание для каждого столбца, а затем используем их при печати, используя любой awk в любой оболочке на каждой машине 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

Вышеуказанное предполагает, что ваш последний столбец всегда должен быть выровнен по левому краю, если это не так, дайте нам знать, так как это несложно сделать в любом случае. Также предполагается, что выравнивание столбца может быть определено значениями (числовыми или нет) в полях в последней строке ввода.

Если входные данные должны поступать из канала, а не из файла (и поэтому вы не можете открыть входные данные дважды), то вы можете сохранить входные данные в массиве и вывести их в разделе 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]
    }
}

и затем назовите его так:

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

решение2

Вы можете использовать column -t your_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

Связанный контент