我的数据如下:
key1 12
key1 14
key1 16
key2 13
key2 14
输出应该是:
key1 16
key2 14
这就是我想要与密钥相关联的更大价值。
如何使用unix命令执行此操作?
答案 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
仅输出包含每个第一个键的第一行(通过第一个键,具有最大值)。