输出文本文件的某些部分

jac*_*ack 2 sed awk perl

我有如下输入:

>gi|481443199|gb|MH447771.1|
49      0       0       0       1
50      0       0       1       0
>gi|987078004|gb|RTYJ01067061.1|
412     0       0       1       0
413     1       0       0       0
>gi|557075006|gb|ERTJ01078061.1|
41     0       0       1       0
41     1       0       0       0
>gi|787073002|gb|WERJ01045061.1|
612     0       0       1       0
613     1       0       0       0
>gi|887079001|gb|WERJ01045061.1|
715     0       0       1       0
716     1       0       0       0
Run Code Online (Sandbox Code Playgroud)

我想打印一些行,但跳过以 开头的所有其他行>(以及它之后的所有行,直到后续的>)。对于上面的示例输入,输出将是:

>gi|481443199|gb|MH447771.1|
49      0       0       0       1
50      0       0       1       0
>gi|557075006|gb|ERTJ01078061.1|
41     0       0       1       0
41     1       0       0       0
>gi|887079001|gb|WERJ01045061.1|
715     0       0       1       0
716     1       0       0       0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

jw0*_*013 8

跳过每隔一个> ...块:

 awk '/^>/ { p = !p } p' input.txt
Run Code Online (Sandbox Code Playgroud)

p是一个打印标志 -p表示在p为真时打印,因为默认操作是print在没有提供时。在 中awk,变量从空开始,在布尔上下文中计算为 false。每次> ...到达一行时,切换p标志。

要打印n> ...行分隔的每个块:

awk -v n=200 '/^>/ { if (skip == 0) skip = n - 1; else --skip; } skip == n - 1' input.txt
Run Code Online (Sandbox Code Playgroud)

这是类似的逻辑,除了因为n不是 2 我们必须使用计数器而不是布尔标志。在这里,skip计算> ...在我们再次开始打印之前要跳过多少行。我使用skip == n - 1作为打印标志作为一个捷径。