awk-最少计算密钥出现的最短时间

时间:2019-06-20 19:31:33

标签: awk

我正在尝试获取键及其出现值,使其在其他键出现中最小。

下面是输入

$ 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

请帮忙修复它。

2 个答案:

答案 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看到它们之前。