그룹별 발생 횟수 계산

그룹별 발생 횟수 계산

첫 번째 열의 각 세 번째 열 집합에 0이 몇 개 있는지 계산합니다. 예를 들어

A   1   0 
A   2   0 
A   3   2 
B   1   2

원하는 출력:

A 2
B 0

그것은 다음과 같습니다:

cat input | awk '{if($3>0) total+=1}END{print total}'

하지만 각기 다른 $1 그룹마다

감사해요!

답변1

연관 배열을 사용하여 awk각 그룹에서 0이 나타나는 횟수를 계산합니다.

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 }

세 번째 열이 0인지 테스트하고, 그렇다면 해당 그룹에 대한 카운터를 증가시킵니다. 그렇지 않은 경우에도 count해당 그룹에 대한 배열의 빈 요소를 인스턴스화합니다. 끝에 0이 있는 그룹을 보고하려면 이 기능이 필요합니다. 이것은 next단지 다음 입력 라인으로 점프하는 것입니다.

muru는 댓글에서 이것이 약간 더 짧은 것으로 대체될 수 있다고 지적했습니다.

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

이는 $3 == 0세 번째 열의 값에 따라 0 또는 1입니다.

최종 출력은 다음을 통해 수행됩니다 printf().

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

OFS그러면 (출력 필드 구분 기호, 기본값은 공백 문자) 사이에 그룹(입력 데이터의 첫 번째 열부터 시작)과 해당 0 개수가 인쇄됩니다 .

세트에 개수가 누락된 경우 printf()형식은 %d0을 삽입합니다.

시험:

$ 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

답변2

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

답변3

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 

관련 정보