パターンで始まる重複行と次の行を削除する方法は?

パターンで始まる重複行と次の行を削除する方法は?

>次の行で始まる重複行を削除したいと思います。

たとえば、

>1
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT
>1 
ACCGGTTTCCTTGAAATT

ご覧のとおり、次の2行が重複しています。

AACCTTCCGGTTAATT and >1 

しかし、次の行だけを削除したい>1ので、出力は次のようになります。

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3
AACCTTCCGGTTAATT

私が次のようなものを使用している場合:

awk '!seen[$0]++'  filename

出力は次のとおりです

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3

>すべての重複行を削除し、その後の次の行から始まる重複行のみを削除したいからです。

私の実際のファイルは約数千行なので、>シンボルの後に複数の繰り返し可能な名前があるかもしれません。

どんな提案がありますか?

答え1

getline次の行を取得するには、awkで使用できます。

awk '/^>/{ if(!seen[$0]++){ print;getline;print } else { getline } }'

複数行を処理するより簡単な答えがあります。

awk '/^>/{ skip = seen[$0]++ }
     { if(!skip)print }'

答え2

POSIXツールボックスの使用:

paste - - <file | awk '{$1=$1};!seen[$0]++' | tr '\t' '\n'

答え3

そしてawk

awk 'NR%2==1{l=$0;next} !seen[l"\n"$0]++{print l"\n"$0}' file
  • NR%2==1>1すべての 2 番目の行は true なので、>2と がある行は です>3。その場合は、内容を変数に保存して行lを続行してくださいnext
  • !seen[l"\n"$0]++ここでは、一意の行を確認せずに確認します。2ユニークな連続ライン。
    • 一意の場合は、最後の行lと現在の行$0の間に改行文字を入れて印刷します\n

出力:

>1 
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT

関連情報