列出每个重复名称的最小值

时间:2019-01-16 08:42:22

标签: unix awk

我正在尝试从文本文件中挑选出最小值,该文本文件包含重复的名称,但值不同。

Peter 0.19827
Wilson 0.99234
Peter 0.08234
May -0.45623
Joe 0.88765
Wilson -0.88341
Joe 0.99943

我尝试过这种方法,但是它不起作用:(我更喜欢awk单线)

cat aaa.txt | sort -k2nr | awk '{if ($2<min[$1]) {min[$1]=$2}}END{for (i in min) {print i,min[i]}}' | less

预期输出:

Peter 0.08234
Wilson -0.88341
May -0.45623
Joe 0.88765

5 个答案:

答案 0 :(得分:1)

如果您不担心Input_file中第一个字段的顺序,请尝试遵循。

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

答案 1 :(得分:1)

没有useless cat或无用的double,并且已修复错误,

sort

错误是未初始化的数组元素默认为零,因此您丢失了那些具有最小正数的元素。

为了方便阅读,我将其折叠;如果愿意,可以删除嵌入的换行符。

如果保留顺序很重要,则可以添加第二个数组来跟踪按键的出现顺序。

awk '!($1 in min) || $2<min[$1] { min[$1] = $2 }
    END { for (i in min) print i,min[i] }' aaa.txt

答案 2 :(得分:0)

如果订购不成问题的另一种方式:

sort -k 1,1 -k 2n,2 file | awk '!_[$1]++'

答案 3 :(得分:0)

又一个awk:

$ awk '!($1 in a)||a[$1]>$2{a[$1]=$2}END{for(i in a)print i,a[i]}' file

输出:

May -0.45623
Peter 0.08234
Joe 0.88765
Wilson -0.88341

解释:

$ awk '
!($1 in a) || a[$1]>$2 {  # if the key (name) has not yet been seen or its value is smaller
    a[$1]=$2              # store it to hash a
}
END {                     # after processing all the records
    for(i in a)           # go thru the stored keys
        print i,a[i]      # print them and their value
}' file

答案 4 :(得分:0)

您也可以尝试Perl。

$ cat tatt.txt
Peter 0.19827
Wilson 0.99234
Peter 0.08234
May -0.45623
Joe 0.88765
Wilson -0.88341
Joe 0.99943
$ perl -lane ' @t=@{$kv{$F[0]}} ;push(@t,$F[1]);$kv{$F[0]}=[@t]; END { for(keys %kv) { @t=sort @{$kv{$_}}; print "$_,$t[0]" }} ' tatt.txt
Joe,0.88765
May,-0.45623
Wilson,-0.88341
Peter,0.08234
$