回答:
でawk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
を含まない行ごとにカウントを増やしX
ます。を含む行のカウントを印刷してリセットしますX
。
X
まで、このソリューションで最初の行数がカウントされて出力されX
ます。EX(コメント欄に新しい行を追加しますが、それぞれの文字の間に改行があると考えることができません; P):Y X Y Y X Y Y Y
考え出力:1 2
END{if (count)print count}
)、およびXは、あなたが追加することができます避けるために開始していた空のライン生産/X/&&count
も条件に
Y
のsは2つX
のsの間に正確にはないため、カウントすべきではないと文句を言います。もう1つは、末尾Y
のsが2つX
のsの間に正確ではないためカウントされないことを訴えます。必要に応じて、OPが明確になるのを待ちます。それまではこの答えで大丈夫です。
$ 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
。
NR
私のアイデアを与える:awk '/X/{print NR - 1; NR = 0}' foo
X
場合を除き、muruの回答の下のコメントで説明したように、2つの回答の出力にはわずかな違いがあります。
別の簡単なawk
OPのサンプルデータ上で動作アプローチと場合は、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
ここでの回答のほとんどは、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