计算“X”之间的行数

计算“X”之间的行数

我想计算“X”之间的行数。这只是一个例子;我必须将代码应用于复杂的生物学结果。如果您能建议一些命令,我​​将不胜感激,最好使用或awk,因为我对这些命令很熟悉。grepsed

例子:

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

相关内容