Мне нужно вычислить некоторые значения в файле (Case1.log), который содержит,

Fault Classes                                                                              #faults
                                                                                           (total)
-------------------------------------------------------------------------------------  --------------
  FU (full)                                                                                 3186
  -----------------------------------------------------------------------------------  --------------
  DS (det_simulation)                                                                   1625 (51.00%)
  DI (det_implication)                                                                   393 (12.34%)
  PU (posdet_untestable)                                                                 123 ( 1.32%)
  PT (posdet_testable)                                                                   420 ( 2.43%)
  UU (unused)                                                                            210 ( 6.59%)
  TI (tied)                                                                               52 ( 1.63%)
  BL (blocked)                                                                             4 ( 0.13%)
  RE (redundant)                                                                           9 ( 0.28%)
  AU (atpg_untestable)                                                                   893 (28.03%)

Я извлек значения из приведенного выше файла, используя сценарий bash, как показано ниже,

#! /bin/bash
DS=$(grep DS $1 | awk -F " " '{print $3" "}')
echo "DS=$DS"
DI=$(grep DI $1 | awk -F " " '{print $3" "}')
echo "DI=$DI"
UU=$(grep UU $1 | awk -F " " '{print $3" "}')
echo "UU=$UU"
TI=$(grep TI $1 | awk -F " " '{print $3" "}')
echo "TI=$TI"
BL=$(grep BL $1 | awk -F " " '{print $3" "}')
echo "BL=$BL"
RE=$(grep RE $1 | awk -F " " '{print $3" "}')
echo "RE=$RE"
PU=$(grep PU $1 | awk -F " " '{print $3" "}')
echo "PU=$PU"
PT=$(grep PT $1 | awk -F " " '{print $3" "}')
echo "PT=$PT"
FU=$(grep FU $1 | awk -F " " '{print $3" "}')
echo "FU=$FU"

Теперь мне нужно использовать извлеченные значения для вычисления уравнения,

NU = expr $DS + $DI + $PT + $PU 
DE = expr $FU - $UU - $TI - $BL - $RE | bc -l

Result = expr $NU / $DE \*100
echo $Result

После запуска скрипта

bash Script.sh Case1.log

$ NU, $ DE и $ Result показывают текст ошибки как

DS=1625
DI=393
UU=210
TI=52
BL=4
RE=9
PU=123
PT=420
FU=3186
2561
2911
expr: missing operand
Try 'expr --help' for more information.
/
expr: syntax error: unexpected argument ‘case1.log’

1
Pavan Kumar 14 Сен 2021 в 12:50

2 ответа

Лучший ответ

Делаем это полностью с awk:

#!/usr/bin/env -S awk -f

# Parse records containing key of two uppercase letters
$1 ~ /[A-Z]{2}/ {
  # Populate associative array with captured key and value
  a[$1] = $3

  # For debug purpose
  printf("%s = %s\n", $1, $3)
}

END {
  # Now that all values have been captured into the associative array,
  # perform computations
  NU = a["DS"] + a["DI"] + a["PT"] + a["PU"]
  DE = a["FU"] - a["UU"] - a["TI"] - a["BL"] - a["RE"]
  result = 100 * NU / DE
  printf("\nNU = %d\nDE = %d\n", NU, DE)
  printf("100 * NU / DE = %f\n", result)
}

Сохраните вышеупомянутый сценарий awk, например, как nuderatio, и сделать его исполняемым chmod +x nuderatio

И запустить это

./nuderatio Case1.log

Выведите его из вашего образца Case1.log:

FU = 3186
DS = 1625
DI = 393
PU = 123
PT = 420
UU = 210
TI = 52
BL = 4
RE = 9
AU = 893

NU = 2561
DE = 2911
100 * NU / DE = 87.976640
0
Léa Gris 14 Сен 2021 в 10:41

Есть два простых способа выполнять вычисления в оболочках UNIX / Linux: $((...)) и awk.

$((...)) очень просто:

Prompt> echo $((1+2*3))
7

Однако он охватывает только целочисленные вычисления:

Prompt> echo $((3/5))
0

Итак, если задействована арифметика с плавающей запятой, рекомендуется использовать другую систему, например awk:

Prompt> awk '{print 3/5}'
0.6

О, что касается процентов: как видите, целочисленная арифметика имеет крошечный недостаток (сколько процентов составляет 3/5):

Prompt> echo $((100 * 3 / 5))
60

Prompt> echo $((3 / 5 * 100))
0

(сначала вычисляется 3/5, равное нулю, ...)

0
Dominique 14 Сен 2021 в 11:04