ADD или SUB номера на основе op -кода (директивы )в строке

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

В хорошо -обслуживаемых библиотеках soname служит в качестве базового уровня ABI, т. е. индикатора обратной совместимости. Для изображения SDL вы можете получить это, используяreadelf:

$ readelf -d /usr/lib/x86_64-linux-gnu/libSDL2_image-2.0.so | grep SONAME
 0x000000000000000e (SONAME)             Library soname: [libSDL2_image-2.0.so.0]

Тем не менее, это не дает вам версию патча; насколько я могу судить, единственный способ определить это — вызвать функцию IMG_Linked_Versionв библиотеке:

#include <stdio.h>
#include <SDL2/SDL_image.h>

int main(int argc, char **argv) {
        const SDL_version *version = IMG_Linked_Version();
        printf("Running with SDL_image version %d.%d.%d\n",
                version->major, version->minor, version->patch);
        return 0;
}

Соберите это с помощью-lSDL2_image(и заголовков SDL ), затем запустите его, чтобы найти версию:

Running with SDL_image version 2.0.4

Некоторые библиотеки определяют символы версий, которые вы также можете использовать, хотя опять же они не обязательно включают информацию об исправлениях; например, для библиотеки GNU C:

$ nm -D /lib/x86_64-linux-gnu/libc-2.28.so | awk '/GLIBC_/ { print $3 }' | sort -V
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_2.25
GLIBC_2.26
GLIBC_2.27
GLIBC_2.28
GLIBC_PRIVATE
-1
15.09.2021, 23:19
1 ответ
$ awk -F'[,]' '{sum=0; for (i=2; i<=NF; i++) sum+=$i; print ($1=="ADD" ? 1 : -1) * sum}' file
35
-55

Если вам нужно было поддерживать больше операций, чем просто ADD и SUB, например.:

$ cat file
ADD 5,10,20
SUB 30,5,20
MULT 2,3,4
DIV 20,2,2

вы можете использовать GNU awk и определять функции для каждой операции, которую вы хотите поддерживать, и вызывать их косвенно:

$ cat tst.awk
function ADD(n)  { sum += n }
function SUB(n)  { sum -= n }
function DIV(n)  { if (n==0) { printf "%s[%d]: Divide by zero error in %s\n", FILENAME, FNR, $0 | "cat>&2"; exit 1 } sum /= n }
function MULT(n) { sum *= n }

BEGIN { FS="[,]" }
{
    op = $1
    sum = (op=="SUB" ? -1 : 1) * $2
    for (i=3; i<=NF; i++) {
        @op($i)
    }
    print sum
}

$ awk -f tst.awk file
35
-55
24
5

Мне пришлось использовать специальный -случай «SUB», чтобы получить желаемый результат из ввода, который вы предоставили для этого, поскольку он обрабатывается иначе, чем остальные (, т.е. все числа вычитаются из нуля, а не все числа добавляются/ умножаются/делятся друг на друга ). Если бы первое число в строке SUB было -30или 0вместо 30, тогда все операции могли бы обрабатываться точно так же, например.:

$ cat file
ADD 5,10,20
SUB 0,30,5,20
MULT 2,3,4
DIV 20,2,2

$ cat tst.awk
function ADD(n)  { sum += n }
function SUB(n)  { sum -= n }
function DIV(n)  { if (n==0) { printf "%s[%d]: Divide by zero error in %s\n", FILENAME, FNR, $0 | "cat>&2"; exit 1 } sum /= n }
function MULT(n) { sum *= n }

BEGIN { FS="[,]" }
{
    op = $1
    sum = $2
    for (i=3; i<=NF; i++) {
        @op($i)
    }
    print sum
}

$ awk -f tst.awk file
35
-55
24
5
0
16.09.2021, 17:37

Теги

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