使用 AWK 的 Min-Max 归一化

Mur*_*dia 2 bash shell awk text-processing gawk

我不知道为什么我无法遍历所有记录。目前它用于最后一条记录并为其打印规范化。

归一化公式:

New_Value = (value - min[i]) / (max[i] - min[i])

程序

{
    for(i = 1; i <= NF; i++)
    {
        if (min[i]==""){  min[i]=$i;}     #initialise min
        if (max[i]==""){  max[i]=$i;}     #initialise max
        if ($i<min[i]) {  min[i]=$i;}     #new min
        if ($i>max[i]) {  max[i]=$i;}     #new max
    }

}
END {
    for(j = 1; j <= NF; j++)
        {
        normalized_value[j] = ($j - min[j])/(max[j] - min[j]);
        print $j, normalized_value[j];
    }
}
Run Code Online (Sandbox Code Playgroud)

数据集

4 14 24 34
3 13 23 33 
1 11 21 31
2 12 22 32
5 15 25 35
Run Code Online (Sandbox Code Playgroud)

电流输出

5 1
15 1
25 1
35 1
Run Code Online (Sandbox Code Playgroud)

所需输出

0.75 0.75 0.75 0.75
0.50 0.50 0.50 0.50 
0.00 0.00 0.00 0.00
0.25 0.25 0.25 0.25
1.00 1.00 1.00 1.00
Run Code Online (Sandbox Code Playgroud)

gle*_*man 5

我会处理文件两次,一次确定最小值/最大值,一次计算归一化值:

awk '
    NR==1 {
        for (i=1; i<=NF; i++) {
            min[i]=$i
            max[i]=$i
        }
        next
    }
    NR==FNR {
        for (i=1; i<=NF; i++) {
            if      ($i < min[i]) {min[i]=$i}
            else if ($i > max[i]) {max[i]=$i}
        }
        next
    }
    {
        for (i=1; i<=NF; i++) printf "%.2f%s", ($i-min[i])/(max[i]-min[i]), FS
        print ""
    }
' file file
# ^^^^ ^^^^  same file twice!
Run Code Online (Sandbox Code Playgroud)

产出

0.75 0.75 0.75 0.75 
0.50 0.50 0.50 0.50 
0.00 0.00 0.00 0.00 
0.25 0.25 0.25 0.25 
1.00 1.00 1.00 1.00 
Run Code Online (Sandbox Code Playgroud)