Результат арифметического расширения без кавычек подвергается подстановке имени файла (расширению с подстановочными знаками )и разбиению поля слова (), как и любому другому расширению без кавычек . Это довольно бесполезно, и несколько оболочек не делают этого, но это то, что делали исторические оболочки (, потому что это было легче реализовать ), и поэтому это то, что стандартизировал POSIX.
Результатом арифметического расширения является просто строка из -
и цифр, поэтому она никогда не может содержать подстановочный знак. (Некоторые оболочки имеют числа с плавающей запятой и могут также включать .
, +
и буквы. )Поскольку он не может содержать пробелы, он также обычно не подлежит разделению полей. Однако разделение полей можно настроить с помощью IFS
:, разделителями полей являются символы IFS
. Включение цифр в IFS
крайне редко и довольно глупо,но если вы хотите написать полностью надежный код, вам необходимо защититься от этого. Это имеет большее значение, если результат может быть отрицательным, потому что включение тире в IFS
не так глупо.
POSIX указывает, что при запуске оболочка должна установить для IFS
значение по умолчанию, чтобы на сценарии не влияло значение IFS
, которое может быть в среде. (Экспортировать IFS
не принято, но кто-то может это сделать. )Однако некоторые широко распространенные оболочки (dash, Busybox sh )сохраняют любое значение IFS
в среде, поэтому надежный сценарий оболочки должен явно устанавливать IFS
на значение по умолчанию (или сбрасывать это, что имеет тот же эффект ), если оно содержит какое-либо расширение без кавычек.
Используя 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