我想计算“X”之间的行数。这只是一个例子;我必须将代码应用于复杂的生物学结果。如果您能建议一些命令,我将不胜感激,最好使用或awk
,因为我对这些命令很熟悉。grep
sed
例子:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
期望输出:
3
4
1
答案1
和awk
:
$ awk '!/X/{count++}/X/{print count; count = 0}' input
3
4
1
对不包含 的每一行增加计数X
;打印并重置包含 的行的计数X
。
答案2
$ 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
负一。/X/{prev=NR}
对于包含 的任何行
X
,将变量设置prev
为当前行号NR
。
答案3
另一种简单的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
答案4
这里的大多数答案都使用嵌入在 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