bash - 使用 AWK 的最小-最大规范化

标签 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];
    }
}

数据集

4 14 24 34
3 13 23 33 
1 11 21 31
2 12 22 32
5 15 25 35

当前输出

5 1
15 1
25 1
35 1

要求的输出

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

最佳答案

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

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!

输出

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 

关于bash - 使用 AWK 的最小-最大规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886440/

相关文章:

linux - 奇怪的返回值 "134"在 Bash 脚本中调用 Gawk

linux - 遍历文件,搜索 nan 的

regex - AWK:从线条模式访问捕获的组

python - socket.sock().bind() 地址已被使用

linux - 如何将默认的 bash/zsh 模式设置为 vi 命令模式而不是 vi 插入模式?

awk - 带有 IP 和 OUI 供应商的 Nmap 输出

awk - 如何使用多个条件查找两个文件之间的差异?

python - 使用来自终端的参数调试 python 脚本

bash - 如何通过 GitHub CLI 与多个受让人创建 merge 请求?

shell - Unix 中更改目录的别名