다음과 같은 파일이 있습니다.
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
sed
uniq
및 다음의 조합을 사용하십시오 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
첫 번째 필드의 숫자를 줄입니다.