첫 번째 열의 각 세 번째 열 집합에 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()
형식은 %d
0을 삽입합니다.
시험:
$ 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