首页 > 解决方案 > 使用 awk 查找区间中的最小值

问题描述

我想在每 5 行间隔中找到所有列的最小值。

例如输入文件

2       3       2
2       3       3
8       9       5
5       3       4
7       2       2
0       4       2
5       6       4
6       4       3
3       8       4
2       3       4

愿望输出

2       2       2
0       3       2

我的以下脚本在选择所有行时工作,例如 NR=10,但是当我选择 NR=5 时,它没有打印所需的输出。

awk '
{
   for (i=1;i<=NF;i++) {
      if (i in min) {
         if ($i < min[i]) {
            min[i]=$i;
            count[i]++
         }
      } else {
         min[i]=$i;
         count[i]++
      }}}
      NR%5==0{
      for (i in min) {
      min1=count[i]?min[i]:0;
      printf ("%10.3f ", min1)
   }
   printf ("\n");
 }'

我无法理解错误在哪里。

标签: shellawk

解决方案


我相信您需要使旧变量值无效并删除数组的先前值,以便每次迭代都从 null 开始,并且不要使用最终会给出误报值的先前迭代值。在站点 https://ideone.com/u0hy15中对其进行了测试

awk '
{
   for (i=1;i<=NF;i++) {
      if (i in min) {
         if ($i < min[i]) {
            min[i]=$i;
            count[i]++
         }
      } else {
         min[i]=$i;
         count[i]++
      }}}
      NR%5==0{
      for (i in min) {
      min1=count[i]?min[i]:0;
      printf ("%10.3f ", min1)
      }
      printf ("\n");
      min1=""
      delete min
 }' Input_file

我在 OP 的代码尝试中添加min1=""delete min作为改进和修复。


推荐阅读