Создание столбцов от текстового вывода, но с несколькими столбцами слова

Невозможно использовать модели разрешений Unix, доступные через файлы /etc/passwd и /etc/shadow и sudo .

Одним из методов, которые я видел в прошлом, было предоставление фронтэнд веб- приложения и/или программы или сценария оболочки, которые могли бы выполняться через sudo , но ничего другого. Это предоставит им API для выполнения очень узкого набора задач через «приложение», без предоставления им реальных возможностей через sudo или общего доступа к командам useradd и usermod .

-121--196361-

bash не может выполнять операции плавающего пункта, только целые числа. Вместо этого я предлагаю использовать bc -l :

$ mPercent='2.72'
$ fPercent='3.14'
$ bc -l <<< $(echo "$mPercent / 100 "*" .482 + $fPercent / 100 "*" .518")
.02937560000000000000

-121--86132-

Я предлагаю использовать bc для арифметических операций и (здесь Последовательность) для ввода значений в bc .

$ mPercent=3.27
$ fPercent=3.27

$ bc -l <<< "$mPercent / 100 * .482 + $fPercent / 100 * .518"
.03270000000000000000

Здесь -l опция bc позволит использовать арифметику с плавающей запятой с более математическими функциями.

0
16.04.2015, 14:37
3 ответа

Можно сделать это с помощью одного лайнера, сохранив последний файл в новую переменную, а затем установив его оригинальный указатель на пустую строку, а затем вывести на экран $0 и сохраненную переменную с последним файлом.

(echo a b c 10; echo x y 2 ; echo x 1) \
       | awk '{lastf=$NF ; $NF="" ; print $0,", "lastf}' \
       | column -ts,

# output
a b c     10
x y       2
x         1
0
28.01.2020, 02:20

Измените сепаратор столбец в E.G. вкладка , чем использование колонна :

output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t'
2
28.01.2020, 02:20

вот решение в awk, который динамически определяет необходимую ширину столбца. Он может принимать любое количество полей на каждой строке, но предполагает, что окончательное поле - это целое число. Целые числа отформатированы, чтобы выстроить справа, по желанию.

Format.awk

#!/usr/bin/awk -f

# Format text and numbers into two columns
# Written by PM 2Ring 2015.04.16

#Gather data, line by line
{
    #Split name from number
    match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a)
    #printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2]

    #Store name & number into arrays
    name[NR] = a[1]
    num[NR] = a[2]

    #Update field widths
    namelen = length(a[1])
    if (namelen > maxname) 
        maxname = namelen

    numlen = length(a[2])
    if (numlen > maxnum) 
        maxnum = numlen
}

#Print re-formatted data
END{
    for(i=1; i<=NR; i++)
        #Use printf's '*' modifier to specify field widths 
        printf "%-*s %*d\n", maxname, name[i], maxnum, num[i]
}

Выход

Person               49
Persons Boss          3
HR                   21
CEO                  93
System Administrator  2

Вы можете вызвать следующее сценарий:

$ awk -f format.awk data_filename

Вы также можете использовать текстовые данные. И если вы используете CHMOD , чтобы дать ему дайте его выполнять разрешения, вы можете запустить его как любую другую команду.

Очевидно, что это немного более подробно, чем решение Коста, которое использует SED , чтобы предварительно обрабатывать вход в колонку . Поэтому я предлагал использовать это, если только вы действительно не хотите, чтобы количество было правильно оправдано. :) ОТО, хотя этот скрипт выглядит , больше, чем одноклассник Коста, awk очень быстро, поэтому я ожидаю, что это решение будет сопоставимым в скорости к Костам, даже с действительно большим Дата файлы.

2
28.01.2020, 02:20

Теги

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