Answers:
与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计数,因为前导s不在两个X
s 之间。其他人则抱怨尾随Y
s不算在内,因为它们并不完全在两个X
s 之间。如果需要,我将等待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
不是在第一个,甚至不是最后一个或重复的Xs中,也可以使用。
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
根据自己的喜好调整值。此方法的优点是,您可以从shell脚本中使用具有任意值的调用程序,needle
而不会产生问题:
awk -f count-rows.awk -v needle="$needle" input