Как я центрируюсь - выравнивают столбец в UNIX?

, если вы на самом деле синхронизируетесь на сервер на один сервер, это Счастливо распечатайте это:

anthony@Watt:~$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-xen1.rack911.co 66.228.59.187    3 u  737 1024  377   81.085   -2.838   1.015
+clock.xmission. .GPS.            1 u  512 1024  377   76.454   -6.912  10.883
+time-c.nist.gov .ACTS.           1 u  169 1024  377    9.470    1.294  29.911
*clock1.alb1.ino .CDMA.           1 u  980 1024  377   29.739   -4.838  11.728

Обязательно перезагрузите NTP после модификации его файла конфигурации. Я даже не вижу Level1e.cs.unc.edu в вашем выходе. (BTW: список серверов выше с использованием бассейна NTP, это не настроено вручную.)

0
17.11.2019, 10:42
2 ответа

Я написал этот ответ до того, как заметил, что вы хотите использовать команду столбца , но если это не является обязательным требованием, вы можете отцентрировать текст с помощью этого скрипта оболочки bash:

#!/bin/bash
set -e    # exit the script if something goes wrong

width=12
data="temperatures 50 12 89 63"

for word in $data; do
    strlen=$(printf $word | wc -c)
    w=$(( ($width - $strlen)/2 ))
    printf "%${w}s%s\n" "" $word
done

Как это работает:

  • $width - это ширина колонки
  • Цикл для печатает каждое слово в $data
  • $strlen - это длина текущего слова, в байтах.
  • $w - это количество пробелов, которое необходимо напечатать перед словом, чтобы сделать его центрированным.
  • printintf печатает $w пробелы, за которыми следует слово

Output:

temperatures
     50
     12
     89
     63

Этот скрипт будет работать только для однобайтовых текстовых кодировок. Например, для обработки текста, содержащего

0
28.01.2020, 04:57

Учитывая некоторый файл,

temps,temperatures,heatness
500,50,50
1212,12,12
899,89,8989
63,6363,63

команда columnмогла дать вам выровненные столбцы, но никакую другую специальную настройку для них:

$ column -t -s, file
temps         temperatures  heatness
500           50            50
1212          12            12
899           89            8989
63            6363          63

С помощью небольшого -небольшого awkскрипта мы можем выполнить центрирование:

$ awk -F, -f center-cols.awk file
temps temperatures heatness
 500       50         50
1212       12         12
 899       89        8989
 63       6363        63
$ awk -F, -v OFS='|' -f center-cols.awk file
temps|temperatures|heatness
 500 |     50     |   50
1212 |     12     |   12
 899 |     89     |  8989
 63  |    6363    |   63

Скрипт center-cols.awkможет выглядеть как

function center(w, string,         space, before, after) {
    space  = w - length(string)  # number of spaces in total to fill
    before = int(space/2)        # spaces before string
    after  = space - before      # the rest of spaces after
    return sprintf("%*s%s%*s", before, "", string, after, "")
}

FNR == 1 {
    for (i = 1; i <= NF; ++i)
        width[i] = length($i)
}

{
    for (i = 1; i <= NF; ++i)
        $i = center(width[i], $i)

    print
}

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

Сначала скрипт получает ширину каждого столбца заголовков и сохраняет их в массив width. Затем он перезаписывает каждый столбец с помощью функции center.

Функция centerпринимает ширину и строку и возвращает строку с центром в пределах этой ширины, с боковыми пробелами, заполняющими неиспользуемое пространство. Результирующая строка строится с использованием sprintf(), в котором фланкирующие пробелы записываются с использованием спецификатора формата %*s. Этот спецификатор принимает ширину и строку, и мы даем ему рассчитанную ширину и пустую строку как для пробела в начале, так и для конца фактических данных (пустая строка будет отформатирована до заданной ширины ).

После переформатирования всех столбцов строки строка печатается.


Проанализировав файл дважды, мы можем найти максимальную ширину каждого столбца.Таким образом, нам не нужно полагаться на строку заголовка, определяющую ширину столбцов :

.
function center(w, string,         space, before, after) {
    space  = w - length(string)  # number of spaces in total to fill
    before = int(space/2)        # spaces before string
    after  = space - before      # the rest of spaces after
    return sprintf("%*s%s%*s", before, "", string, after, "")
}

NR == 1 {
    for (i = 1; i <= NF; ++i)
        width[i] = length($i)
    next
}

FNR == NR {
    for (i = 1; i <= NF; ++i)
        if (width[i] < length($i))
            width[i] = length($i)
    next
}

{
    for (i = 1; i <= NF; ++i)
        $i = center(width[i], $i)

    print
}

Выполнение этого в файле с короткими заголовками столбцов:

$ awk -F, -v OFS='|' -f center-cols.awk file file
 t  | a  | b
500 | 50 | 50
1212| 12 | 12
899 | 89 |8989
 63 |6363| 63

Обратите внимание, что нам нужно дважды указать имя файла в командной строке.

2
28.01.2020, 04:57

Теги

Похожие вопросы