输出文本文件的某些部分

输出文本文件的某些部分

我输入如下:

>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

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

>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

我怎样才能做到这一点?

答案1

要跳过所有其他> ...块:

 awk '/^>/ { p = !p } p' input.txt

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

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

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

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

答案2

对于 awk 你可以这样做:

awk 'BEGIN{pr=true}/^>/{pr=!pr}{if (pr) {print}}'

这会为何时打印设置一个标志 (pr),该标志会在令牌的每次出现时进行切换。

答案3

$ awk '/^>/{f=f?0:1;}f' file

只需在遇到以“^”开头的行时打开和关闭标志变量即可。当它打开时,打印行,否则不打印。

答案4

对于更通用的解决方案,您可以尝试以下方法:

awk 'k%10==0{print} /^>/ {k++}' input.txt

k每当一行以 开始时,变量都会递增>,如果 k modulo 10 为 0,则打印该行。因此,如果您想每第 2 行打印一次,请更改k%10==0k%2==0,每第 200 行将其更改为k%200==0等等。

警告:在此版本中,将始终打印第一行。

相关内容