私の入力は次のとおりです。
>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を表します。では、変数は空の状態で始まり、ブール値コンテキストでfalseと評価されます。行に達するたびにフラグが切り替わります。p
print
awk
> ...
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モジュールで10が0の場合、その行は印刷されます。したがって、2行目ごとに印刷するには、200行目ごとk%10==0
にに変更してください。k%2==0
k%200==0
警告:このバージョンでは、最初の行は常に印刷されます。