我有一个包含两列的数据文件。我想从第二列中找出最大数据值,并将第二列中的每个条目除以最大值。(因此,我将在第二列<= 1.00中获得所有条目)。
我在下面尝试了此命令:
awk 'BEGIN {max = 0} {if ($2>max) max=$2} {print ($2/max)}' angleOut.dat
但我收到如下错误消息。
awk: (FILENAME=angleOut.dat FNR=1) fatal: division by zero attempted
注意:第二列中有一些数据为零值。但是,当零值除以最大值时,我应该得到零,但是如上所述,我得到了错误。
我可以为此提供任何帮助吗?
提前谢谢了。
让我们将其作为示例输入文件:
$ cat >file
1 5
2 2
3 7
4 6
这个awk脚本将规范第二列:
$ awk 'FNR==NR{max=($2+0>max)?$2:max;next} {print $1,$2/max}' file file
1 0.714286
2 0.285714
3 1
4 0.857143
该脚本将读取file
两次输入。第一次,它找到最大值。第二次是打印第二列已标准化的行。
考虑:
max=($2+0>max)?$2:max
这是if-then-else语句的紧凑形式。“如果”部分为$2+0>max
。如果结果为true,则将后面的?
值分配给max
。如果为假,则将后面的:
值分配给max
。
if
语句的更明确的形式也很好。
另外,请注意咒语$2+0
。在awk
变量可以根据上下文字符串或数字。在字符串上下文中,>
比较字典顺序。我们想要一个数值比较。通过将加上零$2
,我们消除了所有疑问,并强制awk
将其$2
视为数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句