匹配线的最大值和最小值

时间:2014-10-07 12:59:28

标签: awk max matching min lines

我想计算文件中匹配行的最小值和最大值:

我有:

xxx 5
xxx 0  
xxx 10  
yyy 1  
yyy 5  
yyy 10

我希望输出:

xxx 0 10
yyy 1 10

xxxyyy匹配的最小值和最大值。

我的代码是:

awk '{if(min==""){min=max=$2}
      if($2>max) {max=$2}
      if($2<min) {min=$2}
      n[$1]++}
      END {for (l in n) {print l "\t" min[l] }}' inputfile

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你需要这个数组:

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

解释

max[]包含每个值的最大值。这同样适用于min[]

  • !($1 in min) {min[$1]=$2; max[$1]=$2}如果当前字段没有min,请对其进行初始化。
  • max[$1]=(max[$1]<$2?$2:max[$1])如果当前第二个字段大于第一列的相应最大值,请替换。
  • min[$1]=(min[$1]>$2?$2:min[$1])与最低限度相同。
  • END { for (i in max) print i, min[i], max[i]}遍历结果并打印出来。

测试

$ awk '!($1 in min) {min[$1]=$2; max[$1]=$2} {max[$1]=(max[$1]<$2?$2:max[$1]); min[$1]=(min[$1]>$2?$2:min[$1])} END { for (i in max) print i, min[i], max[i]}' a
yyy 1 10
xxx 0 10

我们需要在读取第一行时定义最小值和最大值!

$ cat a
x -1
x 0
y 1
x -3
$ awk '!($1 in min) {min[$1]=$2; max[$1]=$2} {max[$1]=(max[$1]<$2?$2:max[$1]); min[$1]=(min[$1]>$2?$2:min[$1])} END { for (i in max) print i, min[i], max[i]}' a
x -3 0
y 1 1