我正在尝试从文本文件中挑选出最小值,该文本文件包含重复的名称,但值不同。
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
答案 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
$