답변:
로 awk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
포함하지 않은 모든 행의 수를 증가시킵니다 X
. 를 포함하는 행의 수를 인쇄하고 재설정하십시오 X
.
X
이이 아닌 경우 첫 번째 행 X
이 일치 할 때까지 첫 번째 행 수가 계산되어이 솔루션으로 출력됩니다 . EX (댓글에 줄 바꾸기를 추가 할 수는 없지만 각 문자 사이에 줄 Y X Y Y X Y Y Y
1 2
END{if (count)print count}
), X가 시작된 곳에 빈 줄을 생성하면 /X/&&count
조건을 추가 할 수 없습니다
Y
의 s가 정확히 두 X
s 사이에 있지 않기 때문에 계산되지 않아야한다고 불평합니다 . 다른 하나는 후행 Y
이 정확히 두 사이에 있지 않기 때문에 계산되지 않는다고 불평합니다 X
. 필요한 경우 OP가 명확해질 때까지 기다립니다. 그때까지는이 답변으로 괜찮습니다.
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1
작동 방식 :
Awk는 입력 파일을 한 줄씩 암시 적으로 읽습니다.
/X/ && prev{print NR-prev-1}
포함 된 행에 대해 X
이전에 값을 할당 한 prev
경우 현재 행의 수 NR
- prev
빼기 1 을 인쇄합니다 .
/X/{prev=NR}
가 포함 된 행의 X
경우 변수 prev
를 현재 행 번호로 설정하십시오 NR
.
NR
은 나에게 아이디어를 준다 :awk '/X/{print NR - 1; NR = 0}' foo
X
muru의 답변 아래 주석에서 설명한 것처럼 두 답변 사이의 출력에 약간의 차이가 있습니다.
awk
OP의 샘플 데이터에서 작동 하고 첫 번째 또는 마지막 또는 반복 된 X에 없는 경우X
간단한 또 다른 접근법 .
awk -v RS='X' 'NF{print NF}' infile
기본값은 각 행에 하나의 필드 어떤 FS있을 때 위가 정확한지 공백을 , 아래에서 달리 계수에 대한 일반적인 경우에 개정 라인 방식 . X 대신 PATTERN 을 입력 할 수 있습니다 .
awk -F'\n' -v RS='X' 'NF>2{print NF-2}'
샘플 입력 :
X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X
출력은 다음과 같습니다.
3
1
2
여기에있는 대부분의 답변은 Awk 프로그램에 포함 된 정규식을 사용하여 계산할 줄의 내용과 일치합니다. 특수 문자 (Awk 또는 정규식)를 포함 할 수있는 내용과 행을 일치시켜야하는 경우 실제로 문자열을 동일한 지 비교하는 것이 좋습니다. 따라서 다음 Awk 스크립트를 muru의 답변 변형으로 제안합니다 .
BEGIN {
count = 0;
}
{
if ($0 == needle) {
if (count) {
print count;
count = 0;
}
} else {
count++;
}
}
텍스트 파일 (예 count-rows.awk
:)로 저장하고 다음과 같이 호출하십시오.
awk -f count-rows.awk -v needle=X input
needle
원하는대로 값을 조정할 수 있습니다 . 이 방법의 장점은 needle
문제를 피하지 않고 임의의 값으로 쉘 스크립트에서 프로그램을 호출 할 수 있다는 것입니다 .
awk -f count-rows.awk -v needle="$needle" input