"X"사이의 줄 수


13

"X"사이의 줄을 세고 싶습니다. 이것은 단지 예일뿐입니다. 복잡한 생물학적 결과에 코드를 적용해야합니다. 가급적 사용하여 명령을 제안 할 수 있다면 awk, grep또는 sed그에 익숙한 것처럼 감사 하겠습니다.

예:

X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X

원하는 출력 :

3
4
1

2
이 분야에서 일하고 있다면 Bioinformatics에 관심 이있을 것입니다.
terdon

답변:


13

awk:

$ awk '!/X/{count++}/X/{print count; count = 0}' input

3
4
1

포함하지 않은 모든 행의 수를 증가시킵니다 X. 를 포함하는 행의 수를 인쇄하고 재설정하십시오 X.


2
첫 번째 행 X이이 아닌 경우 첫 번째 행 X이 일치 할 때까지 첫 번째 행 수가 계산되어이 솔루션으로 출력됩니다 . EX (댓글에 줄 바꾸기를 추가 할 수는 없지만 각 문자 사이에 줄 Y X Y Y X Y Y Y1 2
Dan

1
@muru 이것은 끝 부분에 X가 없다면 (add 필요 END{if (count)print count}), X가 시작된 곳에 빈 줄을 생성하면 /X/&&count조건을 추가 할 수 없습니다
αғsнιη

1
허. 한 의견은 앞 Y의 s가 정확히 두 Xs 사이에 있지 않기 때문에 계산되지 않아야한다고 불평합니다 . 다른 하나는 후행 Y이 정확히 두 사이에 있지 않기 때문에 계산되지 않는다고 불평합니다 X. 필요한 경우 OP가 명확해질 때까지 기다립니다. 그때까지는이 답변으로 괜찮습니다.
muru

12
$ 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.


4
응, 좋아 남용 NR은 나에게 아이디어를 준다 :awk '/X/{print NR - 1; NR = 0}' foo
muru

감사합니다. 정확한 정보를 제공합니다. 필수입니다.
레아

Muro : 멋있고 까다 롭습니다. 하나의 값을 너무 많이 인쇄하는 것을 제외하고는 gawk 및 mawk에서 작동합니다. 이것이 보장 된 행동인지 궁금합니다. @EdMorton?
John1024

3
@rhea 첫 번째 줄이 항상 인 경우가 아니라면 Xmuru의 답변 아래 주석에서 설명한 것처럼 두 답변 사이의 출력에 약간의 차이가 있습니다.
Dan

1
트윗 담아 가기 그것이 도움이되기를 바랍니다.
레아

6

awkOP의 샘플 데이터에서 작동 하고 첫 번째 또는 마지막 또는 반복 된 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

1

여기에있는 대부분의 답변은 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.