вывести массив awk и заменить специальные символы запятыми

Просто для разнообразия вот решение, использующее в основном 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      
4
30.08.2021, 11:16
1 ответ

Когда вы используете такой индекс, как $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всегда содержит две части.

3
30.08.2021, 13:10

Теги

Похожие вопросы