使用该列的最大值规范化列数据
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
将
视为数字。
我有一个包含两列的数据文件。我想从第二列中找出最大数据值,并将第二列的每个条目除以最大值。 (所以我将获得第二列中的所有条目 <= 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
将 视为数字。