>
次の行で始まる重複行を削除したいと思います。
たとえば、
>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