「X」の間の行を数える


13

「X」の間の行を数えたい。これは単なる例です。複雑な生物学的結果にコードを適用する必要があります。できればを使用してawkgrepまたはsedそれらに精通しているように、何らかのコマンドを提案できる場合は感謝します。

例:

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

望ましい出力:

3
4
1

2
この分野で仕事をするなら、バイオインフォマティクスに興味があるかもしれません。
テルドン

回答:


13

awk

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

3
4
1

を含まない行ごとにカウントを増やしXます。を含む行のカウントを印刷してリセットしますX


2
最初の行がでない場合、最初の行が一致するXまで、このソリューションで最初の行数がカウントされて出力されXます。EX(コメント欄に新しい行を追加しますが、それぞれの文字の間に改行があると考えることができません; P):Y X Y Y X Y Y Y考え出力:1 2
ダン

1
@muruこれは動作しませんそこにはXが終了(必要性のアドオンでなかった場合END{if (count)print count})、およびXは、あなたが追加することができます避けるために開始していた空のライン生産/X/&&countも条件に
αғsнιη

1
へえ。あるコメントでは、先頭Yのsは2つXのsの間に正確にはないため、カウントすべきではないと文句を言います。もう1つは、末尾Yのsが2つXのsの間に正確ではないためカウントされないことを訴えます。必要に応じて、OPが明確になるのを待ちます。それまではこの答えで大丈夫です。
ムル

12
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1

使い方:

Awkは入力ファイルを1行ずつ暗黙的に読み取ります。

  • /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

ありがとう、正確な情報を教えてくれます。必須です。
レア

室:ナイス&トリッキー。1つの値をあまりにも多く印刷することを除いて、gawkとmawkの下で機能します。これが保証された動作であるかどうかについて興味があります。@EdMorton?
John1024

3
@rhea最初の行が常にであるX場合を除き、muruの回答の下のコメントで説明したように、2つの回答の出力にはわずかな違いがあります。
ダン

1
@ john1024ありがとう!それが私を助けることを願っています。
レア

6

別の簡単なawkOPのサンプルデータ上で動作アプローチと場合は、X最初になかった、あるいは最後または反復のXインチ

awk -v RS='X' 'NF{print NF}' infile

デフォルトで、各ラインで唯一のフィールドの任意FSがある場合、上記は正しい空白を、そうでない場合は、以下のカウントのための一般的な場合には改訂されるは行単位Xの代わりにパターンを入力できます。

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または正規表現のいずれか)、実際に文字列が等しいかどうかを比較することをお勧めします。したがって、私はmuruの答えの変形として次のAwkスクリプトを提案します:

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.