Подсчет вхождений по группам

Cambié el permiso en su carpeta de nombre de usuario en el directorio de inicio:

sudo chmod 755 {username_folder}

y eliminé el archivo.Xauthority y funcionó.

`sudo rm.Xauthority`
2
05.08.2019, 11:31
3 ответа

Используйте ассоциативный массив в awkдля подсчета вхождений нулей для каждой группы:

awk '$3 == 0 && ++count[$1] || count[$1] { next } END { for (group in count) printf("%s%s%d\n", group, OFS, count[group]) }' file

Немного неловко

$3 == 0 && ++count[$1] || count[$1] { next }

проверит, равен ли третий столбец нулю, и если да, то увеличит счетчик для этой группы. Если это не так, он по-прежнему создает пустой элемент для этой группы в массиве count. Нам нужно это, чтобы иметь возможность сообщать группы с нулевыми нулями в конце. nextпредназначен только для перехода к следующей строке ввода.

Муру указывает в комментариях, что этот бит можно заменить немного более коротким

{ count[$1] += ($3 == 0) }

, где $3 == 0будет либо 0, либо 1 в зависимости от значения в третьем столбце.

Вывод в конце выполняется с помощьюprintf():

printf("%s%s%d\n", group, OFS, count[group])

Это напечатает группу (из первого столбца входных данных )вместе с соответствующим количеством нулей,сOFS(разделителем полей вывода; по умолчанию пробел )в -между ними.

Если счетчик отсутствует для одной группы, формат printf()%dбудет вставлять ноль.

Тестирование:

$ awk '$3 == 0 && ++count[$1] || count[$1] { next } END { for (group in count) printf("%s%s%d\n", group, OFS, count[group]) }' file
A 2
B 0
4
27.01.2020, 21:58
for i in `awk '{if(!seen[$1]++){print $1}}' p.txt`; do re=`awk -v i="$i" '$1 == i && $3 == "0" {print i,NR}' p.txt|wc -l`; echo "$i $re"; done

выход

A 2
B 0
0
27.01.2020, 21:58
awk '{

##use key-value array in awk
if($1 in STORE){
    if($3 ==0){
        STORE[$1]+=1
    } ##if ends for 3rd column check

} ##if ends for A/B check
else{
    if($3 ==0){
        ##check if third column is zero
        STORE[$1]=1
    }else{
        ##if not zero, make value as zero
        STORE[$1]=0
    }

} ##else if A/B not in Store

}
END{
##print everything using for loop

for(key in STORE){
    print key, STORE[key]
}
}  ' file.txt 
0
27.01.2020, 21:58

Теги

Похожие вопросы