web-dev-qa-db-ja.com

次の行がパターンで始まる場合、行を削除します

「a」「c」「t」または「g」で始まらず、次の行が「>」で始まる行を削除したいのですが。次の例では、「 `> seq3」を削除しています。

入力:

>seq1
actgatgac
>seq2
ctgacgtca
>seq3
>seq4
gtagctagt
>seq5
tgacatgca

期待される出力:

>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca

私はsed(sed '/^>.*/{$!N;/^>.*/!P;D}'およびsed '/^>/{$d;N;/^[aA;cC;gG;tT]/!D}')が成功しませんでした。

5
Tiago Minuzzi

あなたはこのようなことを試すことができます:

$ sed -e '$!N;/^>.*\n>/D' -e 'P;D' file
>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca

あれは

  • $!N ... P;Dで2行のバッファを維持する
  • >で始まり、改行の後に別の>があるパターンを探します
  • 改行まで削除
7
steeldriver

Awkの例:

awk 'BEGIN {lasta="XXX"} {if ($0 !~ /^ *>/) printf("%s\n%s\n",lasta,$0);   lasta=$0;}'  fileNAME.txt

に相当

cat fileNAME.txt | awk 'BEGIN {lasta="XXX"} {if ($0 !~ /^ *>/) printf("%s\n%s\n",lasta,$0);   lasta=$0;}'
1
jmf7

Awkコマンドが正常に機能することを試しました

awk '{a[++i]=$0}/^[actg]/{for(x=NR-1;x<=NR;x++)print a[x]}' file.txt

出力

>seq1
actgatgac
>seq2
ctgacgtca
>seq4
gtagctagt
>seq5
tgacatgca
0

pcregrep がインストールされている場合は、次のことを試してください。

pcregrep -M  '^>.*\n[^>]' file

説明

  • -Mは複数行の一致を許可します
  • >で始まり、改行NOTで終わり、その後に>が続くパターンを検索します
0
enharmonic