Просто для разнообразия вот решение, использующее в основном bash
и bc
для плавающей арифметики.
#!/usr/bin/env bash
# r is an associative array of weights, indexed by column name
declare -A r
source <(awk '{ print "r[\"" $1 "\"]=" $6}' <( tail +2 file2))
hdr=
while read line
do
if ! [ $hdr ]
then
hdr=($line)
set -- $line
for h do
printf '%-12s ' "$h"
done
printf '\n'
else
set -- $line
for h in ${hdr[@]}
do
coef=${r[$h]}
printf '%-11.5f ' \
$(bc <<< "scale=6; $1 * $coef")
shift
done
printf '\n'
fi
done < file1
Образец вывода 6x5:
RR1.out RR2.out RR3.out RR4.out RR5.out RR6.out
16.57416 21.01053 3.13118 4.06277 0.47016 0.45179
20.11905 25.49240 3.81561 4.94917 0.57655 0.55459
18.64490 23.63410 3.56182 4.62173 0.53573 0.51524
19.91560 25.24852 3.78686 4.91421 0.57144 0.54958
16.46050 20.87174 3.18052 4.12741 0.47934 0.46049
Когда вы используете такой индекс, как $1,$9
, в массиве в awk
, фактически используется индекс $1 SUBSEP $9
, где SUBSEP
— символ, который вряд ли будет встречаться в реальных данных (фактическое значение определяется реализацией -, но обычно используется восьмеричный 34, символ, называемый "файловый разделитель ", ). Это связано с тем, что стандарт awk
имеет только одномерные -массивы. Многомерные массивы -«симулируются» путем объединения индексов с этим значением SUBSEP
в качестве разделителя.
GNU awk
имеет настоящие многомерные -массивы,но синтаксис [i][j]
, а не [i,j]
.
Вы можете получить исходные биты индекса, возвращенные вам, если вы разделите индекс на это SUBSEP
значение:
for (i in col) {
split(i, k, SUBSEP)
year = k[1]
season = k[2]
printf "%s, %s: %s\n", year, season, col[i]
}
или просто
for (i in col) {
split(i, k, SUBSEP)
printf "%s, %s: %s\n", k[1], k[2], col[i]
}
Оба приведенных выше фрагмента предполагают, что вы знаете, что ваш индекс i
всегда содержит две части.