【问题标题】:normalize column data with maximum value of that column使用该列的最大值规范化列数据
【发布时间】:2015-03-12 15:21:42
【问题描述】:

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

我尝试使用以下命令:

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

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

我能得到任何帮助吗?

非常感谢。

【问题讨论】:

  • 这里的逻辑是不正确的,因为它不会从第二列中找到最大值,因为它将把数字除以到目前为止看到的最大数字(这个看到的最大值可能不是实际的最大值第二列)提供一些示例输入和预期输出以更清晰。

标签: awk gawk


【解决方案1】:

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

$ 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。如果计算结果为真,则将 ? 后面的值分配给 max。如果为 false,则将 : 后面的值分配给 max

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

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

【讨论】:

  • 感谢您的帮助。顺便说一下,你能解释一下“($2+0>max)?$2:max”的含义。为了我的理解,我很想知道这一点。
  • @Vijay 欢迎您。另外,我在答案中添加了一个关于三元语句的部分。
  • 感谢您的解释。这对我很有帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2021-02-16
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多