Дополнение к прекрасному ответу @steeldriver .
7432/1000 не является целым числом. awk
внутренне использует тип компилятора C double
для представления чисел с плавающей запятой. В системах GNU на x86 это IEEE 754 binary64.
Точно так же, как 1/3 не может быть представлено в десятичном виде (, то есть 0,33333 с бесконечным числом троек ), 7432/1000 не может быть представлено в двоичном формате. awk
приближение double
этого числа представляет собой двоичное число, которое при преобразовании обратно в десятичное равно (в точности )7,4320000000000003836930773104541003704071044921875.
Теперь, в awk
, когда не -целые числа преобразуются в строковое представление, точное значение двоичного внутреннего представления не полностью сохраняется. Это было бы не очень полезно, учитывая, что в любом случае большинство этих цифр на самом деле представляют собой ошибку. Вместо этого числа с плавающей запятой преобразуются обратно в строку с помощью специального параметра CONVFMT
, который содержит формат, аналогичный printf
-¹
.
По умолчанию CONVFMT
равно %.6g
. Это означает, что при преобразовании в строку сохраняется только 6 десятичных цифр точности. Это можно изменить на что угодно, хотя обратите внимание, что переносимыми являются только спецификаторы с плавающей запятой (%e
, %f
, %g
... ).
Эти числа преобразуются в строку, когда они используются в качестве аргумента для функций или операторов, которые ожидают строки, например substr()
, конкатенация...
Одним из них, как сказал @steeldriver, являются ключи к ассоциативным массивам, которые всегда являются строками.
Таким образом, выполнение a[7432/1000] = x
на самом деле означает выполнение a[sprintf(CONVFMT, 7432/1000)]
. При значении по умолчанию CONVFMT
это становится a["0.7432"] = x
, но если CONVFMT
изменить на %.1e
, это будет a["7.0e-01"] = x
, или если это было %.25g
, это будет a["7.4320000000000003837"] = x
.
Таким образом, здесь вы можете использовать CONVFMT=%.0f
, чтобы убедиться, что ключи массива являются целыми числами:
$ awk -v CONVFMT=%.0f 'BEGIN{a[7432/1000] = 1; print a[7]}'
1
Однако обратите внимание, что %.0f
округляет до ближайшего целого числа, а %d
усекает десятичную часть.Использование CONVFMT=%d
не является переносимым, хотя будет работать с gawk
и mawk
:
.
$ gawk -v CONVFMT=%d 'BEGIN{a[7564/1000] = 1; print a[7]}'
1
$ gawk -v CONVFMT=%.0f 'BEGIN{a[7564/1000] = 1; print a[8]}'
1
¹ не распространяется на аргументы с плавающей запятой для print
, которые вместо этого преобразуются с использованием OFMT
Предположим, что команда процесса отображается как 'python src/myscript.py'
в списках процессов, таких как ps, top, htop
и т. д.:-
killall -s STOP 'python src/myscript.py'
приостанавливает процессы; -s CONT возобновит их,
Чтобы увидеть все сигналы, killall -l
, но отправка TERM должна завершить их -, а ABRT должна их принудительно удалить.