Unix 为每个重复的名称排序最小值

Unix 为每个重复的名称排序最小值,unix,awk,Unix,Awk,我试图从文本文件中找出最小值,该文件包含重复的名称,但值不同 Peter 0.19827 Wilson 0.99234 Peter 0.08234 May -0.45623 Joe 0.88765 Wilson -0.88341 Joe 0.99943 一、 我已经试过了,但不起作用:(我更喜欢awk一行) 若您不担心输入文件中第一个字段的顺序,请尝试以下操作 awk '{{a[$1]=(a[$1]>$2?a[$1]?a[$1]:$2:$2)} END{for(i in a){print

我试图从文本文件中找出最小值,该文件包含重复的名称,但值不同

Peter 0.19827
Wilson 0.99234
Peter 0.08234
May -0.45623
Joe 0.88765
Wilson -0.88341
Joe 0.99943
一、 我已经试过了,但不起作用:(我更喜欢awk一行)


若您不担心输入文件中第一个字段的顺序,请尝试以下操作

awk '{{a[$1]=(a[$1]>$2?a[$1]?a[$1]:$2:$2)} END{for(i in a){print i,a[i]}}' 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
没有或无用的
排序
,并且修复了错误

awk '!($1 in min) || $2<min[$1] { min[$1] = $2 }
    END { for (i in min) print i,min[i] }' aaa.txt
awk'!(分钟1美元)| | 2美元没有或无用的
排序
,错误修复后

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

awk'!(每分钟$1)| |$2如果订单不是问题,还有一种方式:

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

如果订单不是问题,还有一种方法:

sort -k 1,1 -k 2n,2 file | awk '!_[$1]++'
另一个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
另一个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
您也可以尝试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
$
您也可以尝试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
$

通过查看您的个人资料,了解到有时您没有选择正确的答案。请从所有问题的答案中选择一个答案作为正确答案。通过查看您的个人资料,了解到有时您没有选择任何答案作为正确答案。请从所有答案中选择一个答案作为您所有问题的正确答案。谢谢@Ravinder,我更喜欢tripleee asnwer,因为他有扩展答案以保持第一个字段顺序。谢谢@Ravinder,我更喜欢tripleee asnwer,因为他有扩展答案以保持第一个字段顺序。