0

我的数据是这样的:

key1 12
key1 14
key1 16
key2 13
key2 14

输出应该是这样的:

key1 16
key2 14

那就是我想要与键关联的更大的值。

如何使用unix命令做到这一点?

4

4 回答 4

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
于 2013-09-16T11:48:26.927 回答
1

这样的事情可以做到:

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

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

于 2013-09-16T11:44:58.133 回答
0

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

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

第一种排序首先按键排序,然后在第二个键上以相反的顺序排序。第二个sort仅输出包含每个第一个键的第一行(根据第一次排序,它具有最大值)。

于 2013-09-16T13:49:40.793 回答
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 表达式会出错。

于 2013-09-16T12:13:36.780 回答