我需要找到Rowwise的最大值和最小值

时间:2017-02-09 14:01:44

标签: python shell awk

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 

任何人都可以帮助我

2 个答案:

答案 0 :(得分:0)

@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的值将为RESET,其中N的值将继续增加,直到所有文件被成功读取。然后在该块中我创建了一个名为A的数组,其索引为$ 1,我在检查前一个A [$ 1]的值是否大于当前相同的数组索引与$ NF相比然后更改A [$ 1]的值当前$ NF保持原样(这基本上是为了每行1美元的最大值),同样的事情是我在Input_file中获取$ 1的MINIMUM值并将值存储到数组B.接下来将跳过所有下一个语句都将被执行,因此只会执行FNR == NR条件。 现在FNR == 1&& FNR!= NR条件仅在读取第二个文件的第一行时为TRUE,因为在写入实际输出之前我需要写入标题列。 (A中1美元)现在检查数组A中当前行的$ 1是否存在然后打印当前$ 1和数组A的值,然后根据OP的请求打印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

答案 1 :(得分:0)

你可以试试这个:

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命令,以防你想要缩进...