使用该列的最大值规范化列数据

normalize column data with maximum value of that column

我有一个包含两列的数据文件。我想从第二列中找出最大数据值,并将第二列的每个条目除以最大值。 (所以我将获得第二列中的所有条目 <= 1.00)。

我尝试使用以下命令:

awk 'BEGIN {max = 0} {if (>max) max=} {print  (/max)}' angleOut.dat

但我收到如下错误信息。

awk: (FILENAME=angleOut.dat FNR=1) fatal: division by zero attempted

注意:第二列中有一些数据是零值。但是当零值除以最大值时,我应该得到零,但我得到如上的错误。

我能得到任何帮助吗?

非常感谢。

在查看整个文件之前您无法确定最大值,因此您需要两遍。这个使用两次 awk 执行来获得规范化输出:

awk -vmax=$(awk 'max <  { max =  } END { print max }' angleOut.dat) \
    '{print  / max}' angleOut.dat

让我们以此作为示例输入文件:

$ cat >file
1 5
2 2
3 7
4 6

此 awk 脚本将规范化第二列:

$ awk 'FNR==NR{max=(+0>max)?:max;next} {print ,/max}' file file
1 0.714286
2 0.285714
3 1
4 0.857143

此脚本读取输入 file 两次。第一次,它找到最大值。第二次是打印第二列标准化的行。

三元语句

考虑:

max=(+0>max)?:max

这是 if-then-else 语句的紧凑形式。 "if" 部分是 +0>max。如果计算结果为真,? 之后的值将分配给 max。如果为false,则:后面的值赋值给max.

更明确的 if 语句形式也很有效。

此外,请注意咒语+0。在 awk 中,根据上下文,变量可以是字符串或数字。在字符串上下文中,> 比较字典顺序。我们想要一个数字比较。通过向 </code> 添加零,我们消除了所有疑问并强制 <code>awk 视为数字。