计算“X”之间的行数

Rhe*_*hea 13 command-line text-processing

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

例子:

X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Run Code Online (Sandbox Code Playgroud)

期望输出:

3
4
1
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 13

awk

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

3
4
1
Run Code Online (Sandbox Code Playgroud)

为不包含的每一行增加一个计数X;打印并重置包含X.

  • 如果第一行不是‘X’,那么第一个行数仍然会被计算并用这个解决方案输出,直到第一行与‘X’匹配。EX(不能在注释中添加新行,但考虑到每个字符之间有一个新行;P):`YXYXYXYYY` 将输出:`1 2` (2认同)

Joh*_*024 12

$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

awk 隐式地逐行读取输入文件。

  • /X/ && prev{print NR-prev-1}

    对于包含X并且如果我们之前已经为 赋值的任何行prev,则打印出当前行的编号NR,减去prev减一。

  • /X/{prev=NR}

    对于包含 的任何行,X将变量prev设置为当前行号NR

  • 呵呵,不错。滥用`NR`给了我一个想法:`awk'/X/{print NR - 1; NR = 0}' foo` (4认同)
  • @rhea 除非您的第一行始终是“X”,否则 2 个答案之间的输出会有细微差别,正如我在 muru 答案下的评论中所解释的那样。 (3认同)

αғs*_*нιη 6

另一种awk适用于 OP 样本数据的简单方法,如果X不在第一个甚至最后一个或重复的 X 中。

awk -v RS='X' 'NF{print NF}' infile
Run Code Online (Sandbox Code Playgroud)

当每一行中只有一个字段且默认 FS 有任何空格时,上面是正确的,否则下面在一般情况下被修改为按计数。您可以在那里输入您的PATTERN代替X。

awk -F'\n' -v RS='X' 'NF>2{print NF-2}'
Run Code Online (Sandbox Code Playgroud)

样本输入:

X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X
Run Code Online (Sandbox Code Playgroud)

输出是:

3
1
2
Run Code Online (Sandbox Code Playgroud)