AWK,Perl还是Shell?3列数据文件中的唯一字符串及其最大值

ar.*_*dll 2 string shell perl awk unique

我有一个包含如下数据的文件:

2012-01-02 GREEN 4
2012-01-02 GREEN 6
2012-01-02 GREEN 7
2012-01-02 BLUE 4
2012-01-02 BLUE 3
2012-01-02 GREEN 4
2012-01-02 RED 4
2012-01-02 RED 8
2012-01-02 GREEN 4
2012-01-02 YELLOW 5
2012-01-02 YELLOW 2
Run Code Online (Sandbox Code Playgroud)

我不能总是预测第二列中的字符串是什么(所以在上面的例子中有颜色,但数据文件可以包含第二列中的任何字符串).但是在第三列中总是有一个数字(我希望第二列中的特定字符串的最大值).是不是能够:

  1. 拉出第2列中的每个独特字符串?
  2. 对于每个唯一的字符串,获得最大的相关值(所以使用上面的内容,你最终得到以下内容)?:

    2012-01-02 GREEN 7
    2012-01-02 BLUE 4
    2012-01-02 RED 8
    2012-01-02 YELLOW 5
    
    Run Code Online (Sandbox Code Playgroud)

或者使用Perl(甚至是shell)会更容易吗?任何代码示例非常感谢!

kev*_*kev 7

$ sort -k2,2 -k3,3nr input.txt | awk 'x!=$2{x=$2;print}'
2012-01-02 BLUE 4
2012-01-02 GREEN 7
2012-01-02 RED 8
2012-01-02 YELLOW 5
Run Code Online (Sandbox Code Playgroud)


Mat*_*Mat 5

你可以使用perlawk使用几乎相同的技术(使用关联数组).

这是一个awk例子.max包含给定"密钥"的(当前)最大值lines,即最大值发生的行.

max[$2] < $3 {
  max[$2] = $3
  lines[$2] = $0
}
END {
  for (x in lines)
    print lines[x]
}
Run Code Online (Sandbox Code Playgroud)