【问题标题】:I need to find Maximum and Minimum value Rowwise我需要找到最大和最小值 Rowwise
【发布时间】:2017-02-09 14:01:44
【问题描述】:
operator1,4578
operator2,1234
operator3,9875
operator4,6357
operator1,6353
operator4,9765
operator1,6347
operator1,6798
operator3,6793
operator3,1465
operator4,6796
operator4,3333

我需要使用awkpython 找出每个运算符的最小值和最大值(在awk 以及Python 中也需要命令),输出如下:

Name        Min     Max
operator1   4578    6798 
operator2   1234    
operator3   1465    9875 
operator4   3333    9765 

谁能帮帮我

【问题讨论】:

  • 在 python 中查找字典和在 awk 中查找关联数组
  • 输出中 operator2 的最大值缺失。应该是 1234。
  • 嗨,何塞,我做了 awk -F "," 'BEGIN { max = -1; min = -1 } $1 == "operator1" { max = max $2) ? $2 : min } END { printf "operation2 %d %d", max, min } ' 文件名

标签: python shell awk


【解决方案1】:

你可以试试这个:

awk -F, '
   min[$1]>$2||!min[$1]{
      min[$1]=$2
   } 
   max[$1]<$2{
      max[$1]=$2
   } 
   END{
     for(i in max){
        print i,min[i],(max[i]!=min[i]?max[i]:"")
     }
   }' file

此脚本使用 2 个数组 minmax 在解析输入文件时填充值。

解析完成后,打印两个数组。

请注意,max[i]!=min[i]?max[i]:"" 会跳过最大值,以防它与最小值相同。

我让你放标题行,并使用column 命令以防你想要缩进...

【讨论】:

    【解决方案2】:

    @amit kumar:试试:

    awk -F, 'FNR==NR{A[$1]=A[$1]>$NF?A[$1]:$NF;B[$1]=B[$1]>$NF?$NF:(B[$1]?B[$1]:$NF);next} FNR==1 && FNR!=NR{print "Name Min Max"}($1 in A){print $1 "\t" B[$1] "\t" A[$1];delete B[$1];delete A[$1]}'  Input_file  Input_file
    

    这里我将字段分隔符设置为“,”,然后 FNR==NR 条件将确保它仅在第一次读取 Input_file 时执行。其中 FNR 和 NR 都是 awk 的内置关键字,并在其中定义行号。每当读取新的 Input_file 时,FNR 的值将被重置,其中 N 的值将不断增加,直到所有文件都被成功读取。然后在该块中,我创建一个名为 A 的数组,其索引为 $1 并且我正在检查先前 A[$1] 的值是否大于与 $NF 相比的当前相同数组索引,然后更改 A[$1] 的值到当前的 $NF 保持原样(这基本上是为了为每行 $1 设置最大值),我正在做同样的事情来获取 Input_file 中 $1 的最小值并将值存储到数组 B 中。接下来将跳过所有接下来的语句,因此只会执行 FNR==NR 条件。 现在 FNR==1 && FNR!=NR 条件将仅在读取第二个文件的第一行时为 TRUE,因为在写入实际输出之前我需要写入标题列。 ($1 in A) 现在检查当前行的 $1 是否存在于数组 A 中,然后根据 OP 的请求打印当前的 $1 和数组 A 的值,然后打印数组 B 的值。

    编辑:现在也添加非单线形式的解决方案。

    awk -F, 'FNR==NR{
                     A[$1]=A[$1]>$NF?A[$1]:$NF;
                     B[$1]=B[$1]>$NF?$NF:(B[$1]?B[$1]:$NF);
                     next
                    }
             FNR==1 && FNR!=NR{
                                    print "Name Min Max"
                              }
             ($1 in A){
                            print $1 "\t" B[$1] "\t" A[$1];
                            delete B[$1];
                            delete A[$1]
                      }
            '    Input_file  Input_file
    

    【讨论】:

    • 嗨 Ravinder,感谢您的详细解释,但代码没有给出任何输出,而且它只是一个文件而不是两个文件
    • 正确的,它是 1 个文件,但我正在阅读它两次,试一试,它应该会飞。让我知道。还有为什么我要读取 Input_file 2 次,因为它会以 Input_file 中存在的相同顺序给出输出,否则如果您读取数组,它将不会按顺序打印元素。
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2011-12-09
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多