Unix에서 정의된 패턴에 대한 보고서를 수집하기 위해 grep 및 awk를 사용하시겠습니까?

Unix에서 정의된 패턴에 대한 보고서를 수집하기 위해 grep 및 awk를 사용하시겠습니까?

다음과 같은 파일이 있습니다.

abc:: vvnm\/asj\/pqr
 sadnck
 acdsd
abc:: kfjwej\/asj\/pqr
 frtrt
 ewrfe
 adsf
abc:: flkm\/csj\/lqr
abc:: kmflkm\/asj\/pqr
 sdvd
 dfff

이렇게 출력하고 싶습니다. [이후: abc, count 셀]

3 kfjwej/asj/pqr
2 vvnm/asj/pqr
2 kmflkm/asj/pqr
0 flkm/csj/lqr

답변1

awk해결책:

awk '/^[0-9]+:abc /{
         if (abc) print count abc;
         sub(/^[0-9]+/, "");
         abc = $0; count = 0; next
     }
     abc{ count++ }
     END{ print count abc }' file

산출:

2:abc vvvvv
3:abc kfjwej
2:abc kmflkm

새로운 파일 형식을 사용하는 추가(그리고 마지막) 방법awk 소스 파일:

count_abc.awk스크립트:

#!/bin/awk -f
/^abc::/{ 
    if (abc) print count, abc;
    gsub(/\\/, "", $2);
    abc = $2; count = 0; next 
}
abc { count++ }
END { print count, abc }

용법:

awk -f count_abc.awk newfile

산출:

2 vvnm/asj/pqr
3 kfjwej/asj/pqr
2 kmflkm/asj/pqr 

답변2

seduniq및 다음의 조합을 사용하십시오 awk.

$ sed '/^[^[:space:]]/{s/^[^[:space:]]* //g;s#\\##g;h;}; g' file | uniq -c | awk '{ $1 -= 1; print }'
2 vvnm/asj/pqr
3 kfjwej/asj/pqr
0 flkm/csj/lqr
2 kmflkm/asj/pqr

스크립트 sed, 주석:

/^[^[:space:]]/{             # this line starts with a non-space
    s/^[^[:space:]]* //;     # remove the thing that is not a space, up to the space
    s#\\##g;                 # remove backslashes
    h;                       # store in hold space
};

g;                           # get hold space
                             # (implicit print)

그 기능은 각 "자막 행"을 해당 "헤더 행"으로 대체하여 생성하는 것입니다.

vvnm/asj/pqr
vvnm/asj/pqr
vvnm/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
kfjwej/asj/pqr
flkm/csj/lqr
kmflkm/asj/pqr
kmflkm/asj/pqr
kmflkm/asj/pqr

그런 다음 uniq연속된 고유 행 수를 계산하여 생성합니다.

   3 vvnm/asj/pqr
   4 kfjwej/asj/pqr
   1 flkm/csj/lqr
   3 kmflkm/asj/pqr

를 사용하여 awk첫 번째 필드의 숫자를 줄입니다.

관련 정보