我有一个包含如下数据的文件:
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
我不能总是预测第二列中的字符串是什么(所以在上面的示例中有颜色,但数据文件可以包含第二列中的任何字符串)。但是在第三列中总是有一个数字(我希望第二列中的特定字符串的最大值)。是不是能够:
对于每个唯一字符串,获取最大关联值(因此,使用上面的内容,您最终得到以下内容)?:
2012-01-02 GREEN 7
2012-01-02 BLUE 4
2012-01-02 RED 8
2012-01-02 YELLOW 5
或者使用Perl(甚至是shell)会更容易吗?任何代码示例都非常感谢!
答案 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)
您可以使用几乎相同的技术(使用关联数组)在perl
或awk
中执行此操作。
这是一个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