AWK - Return 基于共同特征的输入中的最小值

AWK - Return minimum value in input based on common feature

我有以下输入:

...
MSG1 10ms
MSG2 20ms
MSG3 25ms
MSG1 5ms
MSG3 2ms
MSG2 1ms
...

我正在寻找如下输出:

MSG1
Min: 5ms

MSG2
Min: 1ms

MSG3
Min: 2ms

我目前拥有的代码,其布局如下:

#!/usr/bin/gawk -f

BEGIN {
        print "Testing"
} #End of BEGIN
{ #Start of MID
        key =  #Message Extracted 10 Total
        min = 100
} #End of MID
END {
                for (MSG in MSG_TYPE) {
                        print MSG
                        print "MIN: "min
                        print "\n"
                }
} #End of END

但我无法从输入数据中提取最小值。我知道如何从逻辑上获取数据,但实际上对其进行编码是另一回事。我们将不胜感激任何帮助。

你可以试试这个awk:

awk '{m=+0; a[]=a[]?(m<a[]?m:a[]):m} END{for (v in a) {printf "%s\nMin: %sms\n\n", v,a[v]}}' file

解释:

  • m=+0 - 这使得 5ms5 整数部分。
  • a[]?(m<a[]?m:a[]):m - 一开始 a[] 的索引 </code> 将具有空值,因此将 <code>m 设置为初始值。下一次,a[] 将有价值,然后对 m<a[].
  • 进行检查

输入文件:

cat data
MSG1 10ms
MSG2 20ms
MSG3 25ms
MSG1 5ms
MSG3 2ms
MSG2 1ms

命令:

    #List all the files with minimum values
    #Print only first occurrence of those files.
    #Print values below to file name
    #Print keyword "Min:" 


  sort -g -k2 data | awk '\!seen[]++' | sort | xargs -n 1 | sed 's/^[0-9]/  min: &/g'
MSG1
  min: 5ms
MSG2
  min: 1ms
MSG3
  min: 2ms