我的数据是这样的:
key1 12
key1 14
key1 16
key2 13
key2 14
输出应该是这样的:
key1 16
key2 14
那就是我想要与键关联的更大的值。
如何使用unix命令做到这一点?
我的数据是这样的:
key1 12
key1 14
key1 16
key2 13
key2 14
输出应该是这样的:
key1 16
key2 14
那就是我想要与键关联的更大的值。
如何使用unix命令做到这一点?
请试试这个单行:
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
这样的事情可以做到:
$ awk '($2 > a[$1]) {a[$1]=$2} END{ for (i in a) print i, a[i]}' file
key1 16
key2 14
它将数据存储在数组a[]
中,因此索引是第一个字段,值是值。当它完成读取文件时,END
它会遍历数组并打印结果。
您可以调用sort
两次(不是最有效的方式,但它很简洁):
sort -k1,1 -k2,2r file.txt | sort -u -k1,1
第一种排序首先按键排序,然后在第二个键上以相反的顺序排序。第二个sort
仅输出包含每个第一个键的第一行(根据第一次排序,它具有最大值)。
使用 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 表达式会出错。