如何为特定密钥找到更大的价值

时间:2013-09-16 11:40:49

标签: linux shell unix duplicates

我的数据如下:

key1 12
key1 14
key1 16
key2 13
key2 14

输出应该是:

key1 16
key2 14

这就是我想要与密钥相关联的更大价值。

如何使用unix命令执行此操作?

4 个答案:

答案 0 :(得分:3)

请尝试这个单行:

awk '{a[$1]=$2>a[$1]?$2:a[$1]}END{for(x in a)print x, a[x]}' file

修改

哎呀,在我发布这个答案之后,我注意到fedorqui发布了一个非常相似的。(比我早3秒)我只是添加另一个。但上述awk-oneliner是首选。

sort -k1,1 -k2,2nr file|awk '$1!=t{t=$1;print}'

包含您的数据:

kent$  echo "key1 12
key1 14
key1 16
key2 13
key2 14"|sort -k1,1 -k2,2nr|awk '$1!=t{t=$1;print}'
key1 16
key2 14

答案 1 :(得分:1)

这样的事情可以做到:

$ awk '($2 > a[$1]) {a[$1]=$2} END{ for (i in a) print i, a[i]}' file
key1 16
key2 14

它将数据存储在数组a[]中,因此索引是第一个字段,值是值。当它完成读取文件时,在END中循环遍历数组并打印结果。

答案 2 :(得分:0)

使用bash,您可以使用以下脚本来获得所需内容:

declare -A result
( while read key val; do
    if [ "${result[$key]}" == "" ]; then
      result[$key]=$val;
    elif [ ${result[$key]} -lt $val ]; then
      result[$key]=$val;
    fi;
  done;
  for key in ${!result[@]}; do
    echo "$key ${result[$key]}";
  done
)

注意,值必须是整数。否则,第二个if-expression将给出错误。

答案 3 :(得分:0)

您可以拨打sort两次(不是最有效的方式,但它很简洁):

sort -k1,1 -k2,2r file.txt | sort -u -k1,1

第一种排序首先按键排序,然后按第二种键的相反顺序排序。第二个sort仅输出包含每个第一个键的第一行(通过第一个键,具有最大值)。