Другое решение awk
:
$ awk '
FNR==NR {
a[$1] = $2;
c[$1] = $1;
next;
}
{
b[$1] = $2;
c[$1] = $1;
}
END {
printf "type\tvalue1\tvalue2\tdifference\n";
for(i in c)
printf "%s\t%d\t%d\t%d\n", i, a[i], b[i], a[i]-b[i]
}' file1 file2
type value1 value2 difference
remark 2 240 -238
test 27 0 27
viewer 23 2990 -2967
exam 0 200 -200
printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'
Поскольку оболочка bash
не выполняет арифметические операции с плавающей запятой, проще сравнивать числа с плавающей запятой на другом языке. Здесь я использую awk
, чтобы найти максимум всех элементов в массиве ARRAY
.
Команда printf
выведет каждый элемент массива на отдельной строке, а код awk
обновит его значение m
, чтобы оно стало максимальным из просмотренных до сих пор значений. В конце печатается значение m
.
Проверка на NR == 1
будет истинной для первой строки, прочитанной программой awk
, и инициализирует значение m
первым значением массива (, что вы не можете сделать, это означает, что ваш код вернул бы 0
для массива со всеми отрицательными числами, если бы он работал ).
Если вы хотите выполнять арифметику с плавающей запятой, вам нужно переключиться на ksh93, zsh или yash (или fish
, если вы готовы уйти от Борна -, как оболочки ), bash
их не поддерживает.
Для синтаксиса, совместимого со всеми 3 оболочками:
max() {
[ "$#" -gt 0 ] || return
typeset i max="$1"; shift
for i do
if [ "$((i > max))" -ne 0 ]; then
max=$i
fi
done
printf '%s\n' "$max"
}
array=(12.5 6.2 nan 0xfff -inf inf -1e12 1e20)
max "${array[@]}"
(вам нужна последняя версия zsh
для поддержки inf
/ nan
. Варианты регистра поддерживаются во всех 3 (INF
, NaN
, Inf
... ), но только yash
поддерживает альтернативные варианты написания, такие как Infinity
; Типы номеров 0x12p34
еще не поддерживаются zsh
.Имейте в виду, что 010
означает 10 или 8, зависит от оболочки и ее конфигурации )