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

时间:2012-02-22 09:52:17

标签: string perl shell 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

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

  1. 拉出第2列中的每个唯一字符串?
  2. 对于每个唯一字符串,获取最大关联值(因此,使用上面的内容,您最终得到以下内容)?:

    2012-01-02 GREEN 7
    2012-01-02 BLUE 4
    2012-01-02 RED 8
    2012-01-02 YELLOW 5
    
  3. 或者使用Perl(甚至是shell)会更容易吗?任何代码示例都非常感谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

您可以使用几乎相同的技术(使用关联数组)在perlawk中执行此操作。

这是一个awk示例。 max包含给定"键"({1}}最大值发生线的(当前)最大值。

lines

答案 2 :(得分:2)

这可能对您有用:

cat -n file | sort -ruk2 | sort -uk2,3 | sort -n | cut -f2
2012-01-02 GREEN 7
2012-01-02 BLUE 4
2012-01-02 RED 8
2012-01-02 YELLOW 5

如果订单不是问题:

sort -k1,2 -k3nr file | sort -uk1,2 
2012-01-02 BLUE 4
2012-01-02 GREEN 7
2012-01-02 RED 8
2012-01-02 YELLOW 5

答案 3 :(得分:1)

有类似的想法使用数组

awk '{i=$1" "$2;if($3>c[i]){c[i]=$3}}END{for(a in c){print a,c[a]}}' colors.txt
2012-01-02 RED 8
2012-01-02 YELLOW 5
2012-01-02 GREEN 7
2012-01-02 BLUE 4

和perl one

perl -lne '/^(.*)(\d+)$/;$x{$1}=$2 if $2>$x{$1};END{for(sort keys %x){print $_,$x{$_}}}' colors.txt
2012-01-02 BLUE 4
2012-01-02 GREEN 7
2012-01-02 RED 8
2012-01-02 YELLOW 5