我正在尝试获取键及其出现值,使其在其他键出现中最小。
下面是输入
$ cat in1.txt
102,27.40
102,35.40
102,23.40
102,57.40
103,56.40
103,23.76
103,12.50
103,87.12
103,52.90
103,35.70
103,72.80
106,56.12
106,66.43
105,87.12
105,34.90
105,55.00
我尝试了如下所示的方法来获得最大的出现次数,并给出正确的结果。
$ awk -F, ' { c[$1]++;if(max<c[$1]) { max=c[$1];maxa=$1 }} END { print max, maxa } ' in1.txt
7 103
即key = 103出现7次,其中与其他其他关键事件102 = 4、106 = 2和105 = 3相比,最大值为7
类似地,我想获得最小值,但结果却不正确
$ awk -F, ' { if(NR==1) { min=1;minr=$1 } c[$1]++;if(c[$1]<=min ) { min=c[$1];minr=$1 }} END { print min, minr } ' in1.txt
1 105 # Wrong
预期结果是
2 106
请帮忙修复它。
答案 0 :(得分:3)
这两个都做
$ awk -F, '{a[$1]++; min++}
END{for(k in a)
{if(a[k]<min) {min=a[k]; mink=k}
if(a[k]>max) {max=a[k]; maxk=k}}
print "min",min,mink;
print "max",max,maxk}' file
min 2 106
max 7 103
或者也许是完整的计数,更容易
$ awk -F, '{a[$1]++} END{for(k in a) print a[k],k}' file | sort -n
2 106
3 105
4 102
7 103
第一个脚本对所有行进行计数,以将最小值设置为默认值,最大值将不需要一个。
或者,没有awk
$ cut -d, -f1 file | sort | uniq -c | sort -n
2 106
3 105
4 102
7 103
头/尾会相应地给您提供最小值和最大值。
答案 1 :(得分:2)
如果您的输入是由所有连续的键值组成的,如示例输入中所示,则可以执行以下操作:
$ cat tst.awk
BEGIN { FS="," }
$1 != prev {
if ( NR == 1 ) {
minKey = $1
maxKey = $1
}
else {
minKey = (cnt[prev] <= cnt[minKey] ? prev : minKey)
maxKey = (cnt[prev] >= cnt[maxKey] ? prev : maxKey)
}
prev = $1
}
{ cnt[$1]++ }
END {
minKey = (cnt[prev] <= cnt[minKey] ? prev : minKey)
maxKey = (cnt[prev] >= cnt[maxKey] ? prev : maxKey)
print cnt[minKey], minKey
print cnt[maxKey], maxKey
}
$ awk -f tst.awk file
2 106
7 103
如果没有,那么您总是可以sort file | awk -f tst.awk
制作它们,以便在awk看到它们之前。