awk - получить наименьшее количество, где ключ появляется минимальное время - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь получить ключ и его значение вхождения, где оно является минимальным среди других вхождений ключа.

Ниже вводится

$ 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

, то есть ключ = 103, встречается 7 раз, где 7 - максимум по сравнению с другими ключевыми вхождениями 102 = 4, 106 = 2 и 105 = 3

Точно так же я хочу получить минимум, но он дает неверные результаты

$ 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 ]

3 голосов
/ 20 июня 2019

это будет делать оба

$ 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

голова / хвост даст вам мин и макс соответственно.

2 голосов
/ 21 июня 2019

Если ваш ввод организован со всеми смежными значениями клавиш, как показано в примере ввода, вы можете сделать это:

$ 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видит их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...