Выполнение расчетов по табличным результатам и печать результатов в табличной форме

Результат арифметического расширения без кавычек подвергается подстановке имени файла (расширению с подстановочными знаками )и разбиению поля слова (), как и любому другому расширению без кавычек . Это довольно бесполезно, и несколько оболочек не делают этого, но это то, что делали исторические оболочки (, потому что это было легче реализовать ), и поэтому это то, что стандартизировал POSIX.

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

POSIX указывает, что при запуске оболочка должна установить для IFSзначение по умолчанию, чтобы на сценарии не влияло значение IFS, которое может быть в среде. (Экспортировать IFSне принято, но кто-то может это сделать. )Однако некоторые широко распространенные оболочки (dash, Busybox sh )сохраняют любое значение IFSв среде, поэтому надежный сценарий оболочки должен явно устанавливать IFSна значение по умолчанию (или сбрасывать это, что имеет тот же эффект ), если оно содержит какое-либо расширение без кавычек.

-1
18.08.2020, 15:28
1 ответ

Используя GNU grep, GNU awk, я набросал простейшее и быстрое решение вашей проблемы. Предположим, что после строки, состоящей из всех тире, нет пустых строк, а отчет о часах всегда происходит после строки, состоящей из тире, и есть только одна такая строка.

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

$ pt_rpt="your_primetime_report_name";

$ fws="$(< "$pt_rpt" grep -m1 -B1 -E '^-+$' | head -n1 | grep -oP '\S+(?:\s+|$)' | awk '{print length()}' | paste -s)" \
awk '
  BEGIN {
    FIELDWIDTHS = ENVIRON["fws"]
    OFS = ""
  }
  /^-+$/,0 {
    if ( /^-+$/ ) { print prev }
    else {
      ### frequency calculation
      Tper = $2+0
      freq = sprintf("%-*s", length($2), sprintf("%g", 1e3/Tper))
      $2 = freq
      ### duty cycle determination
      Ton = $3; sub(/[[:space:]]+$/, "", Ton)
      nf = split(Ton, a, /[}[:space:]]/)
      Ton = a[nf-1]
      D = sprintf("%-*s", length($3), sprintf("%g%%", 1e2*Ton/Tper))
      $3 = D
    }
    print; next
  }
  { prev = $0 }
'  < "$pt_rpt"

Выход:

Clock             Period          Waveform            Attrs     Sources
-----------------------------------------------------------------------
axi_ACLK          800             50%                           {axi_AC
xyz               800             50%                 G         {abc/xy
0
18.03.2021, 23:11

Теги

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