空の行とその上の行を削除します。

空の行とその上の行を削除します。

何百万ものDNA配列を含む大容量の.fnaファイルがあります。プライマーを切断した後、いくつかの書き込みエラーのためにいくつかのシーケンスヘッダーが残り、その後にシーケンスがありません。以下に例を示します。ワークフロースクリプトを引き続き使用できるように、これらのヘッダーと空白行を削除する必要があります。

B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0
AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT

B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0
AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT

A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0

A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0
AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT

A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0したがって、この例では、その行とその下の空の行を削除したいと思います。

sedだけを使用して空の行を削除しましたが、私のシナリオに適した例が見つかりませんでした。

答え1

sed '$!N;/:.*\n$/d;P;D' <infile

上記のコマンドは、N最後の行ではなくすべての行から追加の行を取得します。コロンが見つかり、最後の文字が改行されたパターン空間を見つけた場合、バッチは削除されます。つまり、コロンを含む行と次の行が空の場合、両方が削除されます。他のすべての場合は、パターンスペースに最初に表示されるewlineまで印刷し、残りの部分から始める前に同じ内容を削除します。これにより、ファイル全体で1行のプレビューを実行できます。!$:\nP\nD

答え2

(以下の解決策については、各ヘッダ+シーケンス行の前に空白行をしたいとします。後ろに空白行が必要な場合は教えてください。簡単に変更できます。)

使用sed

$ sed -rn 's/(.{106})/\n\1/p' file

B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0 AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT

B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0 AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT

A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0 AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT

どのように動作しますか?

  • -r

    -rsed拡張正規表現を使用するように指示します。

  • -n

    -nsed明示的に要求されない限り、行を印刷しないでください。

  • s/(.{106})/\n\1/p

    行に106文字以上がある場合は、先頭に改行文字を追加して印刷します。

    空白行には106文字がないため、印刷されません。

    DNA配列のない行は106文字より短いため印刷されません。

    DNA配列を含むラインを印刷します(106文字以上)。空白行自体は印刷されないため、行の先頭に改行文字を追加する必要があります。これにより、各DNAレコードの前に空白行が続きます。

GNUではないsed

OSX(BSD)を使用している場合は、以下を試してください。

sed -E -n -e 's/(.{106})/\n\1/p' file

使用awk

awk '$6 {print "\n"$0}' file

DNA配列は行の6番目のフィールドです。したがって、空でない6番目のフィールドがある行の場合は、その行の前に改行文字を印刷します。

答え3

これを使ってこれを行うことができることに言及したいと思いましたvi

:g/PATTERN/normal 2dd

PATTERNあなたが探しているものはどこにありますか?その後、パターンに従って一致してPATTERN実行されます2dd(行削除 - 2回)。normal

答え4

Ex/viを使う

@ReulSharabin が提案したコマンドを実行します。

ex -s +'g/bc_diffs=0$/d +2' +x   file

これは次のようになります。

vim +':g/bc_diffs=0$/d +2' +:x   file

(+コマンド = コマンド実行; +x= 保存と終了)

わかりました、わかりました、これは悪い考えです。

関連情報