AWK - 根据共同特征返回输入的最小值

时间:2016-06-22 06:43:44

标签: awk gawk

我有以下输入:

...
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 = $1 #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

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

2 个答案:

答案 0 :(得分:2)

您可以试试awk

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

<强>解释

  • m=$2+0 - 这使5ms成为5整数部分。
  • a[$1]?(m<a[$1]?m:a[$1]):m - 首先a[$1]的{​​{1}}索引的空值为空,因此将$1设置为初始值。下次m会有价值,然后对a[$1]进行检查。

答案 1 :(得分:1)

输入文件:

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[$1]++' | sort | xargs -n 1 | sed 's/^[0-9]/  min: &/g'
MSG1
  min: 5ms
MSG2
  min: 1ms
MSG3
  min: 2ms