Разделение Bash Awk дает разные результаты

#linux #bash #awk

#linux #bash #awk

Вопрос:

Я пытаюсь вычислить некоторые значения, используя awk.Но я получаю разные результаты при делении на 100 и использовании команды linux getconf CLK_TCK.

В моем случае команда всегда возвращает 100:

 [centos@op5test1 ~]$ getconf CLK_TCK
100
  

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

 [centos@op5test1 ~]$ echo 26178 4861 | awk '{print ($1 $2)/$(getconf CLK_TCK)}'
1.18569
  

и теперь присваиваем значение 100

 [centos@op5test1 ~]$ echo 26178 4861 | awk '{print ($1 $2)/100}'
310.39
  

Почему я получаю разные значения?

Ответ №1:

Правильный способ передать вывод вашей getconf команды из командной строки:

 echo 26178 4861 | awk -v val=$(getconf CLK_TCK) '{print ($1 $2)/val}'
310.39
  

$(getconf CLK_TCK) при использовании непосредственно внутри awk команды вычисляется $0 , что является 26178 4861 , и затем вы эффективно выполняете:

 print ($1 $2)/$0
  

который выполняет эту арифметику:

 (26178   4861)/26178 => 1.18569
  

Комментарии:

1. Да, это решило мою проблему. Еще одно сомнение: если попытаться сохранить выходное значение this (getconf CLK_TCK) в какой-либо переменной, а затем попытаться использовать его в awk ‘{print ($ 1 $ 2) / $ val}’, все еще сохраняется $ 0 в $ val в awk?

2. вы можете использовать это в оболочке: val=$(getconf CLK_TCK); echo 26178 4861 | awk -v val="$val" '{print ($1 $2)/val}'