大きなテキストファイルから行のサブセットを抽出する

大きなテキストファイルから行のサブセットを抽出する

タブで区切られた9つの列を持つ大容量ファイルがあります。ファイルサイズは約39MB、行数は約250,000個です。最後の列である9番目の列には、この情報が含まれています。 (これはすべて1つの列です。スペースは新しい列を表すのではなく、その列の「データ」のみを表します。)

TF_binding_site_cage_181208 ZNFN1A2-91741 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_+_149850517 
TF_binding_site_cage_181208 ZNFN1A2-92447 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 
TF_binding_site_cage_181208 ZNFN1A2-92446 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 
TF_binding_site_cage_181208 ZNFN1A2-92445 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 
TF_binding_site_cage_181208 SNAI1-3-177789 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_+_52294530 
TF_binding_site_cage_181208 SNAI1-3-178434 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52294717 
TF_binding_site_cage_181208 SNAI1-3-178161 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52604408 
TF_binding_site_cage_181208 SNAI1-3-177489 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52936367 
TF_binding_site_cage_181208 MEF2A,C,D-173519 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_144711658 
TF_binding_site_cage_181208 MEF2A,C,D-173496 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_-_145085726 
TF_binding_site_cage_181208 MEF2A,C,D-172831 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_145136211 
TF_binding_site_cage_181208 MEF2A,C,D-173254 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr9_+_696759 

デフォルトでは「MEF2 *」のみを含む行を探しているため、上記の例では最後の4行のみを選択しています。また、この列だけでなく行全体も望んでいます。

私はこれをawk-ingし、ExcelにインポートしてRにインポートしようとしましたが、時々私のアプローチはうまくいきますが、すべての行が得られたかどうか「確認」できないことが心配です。 (MEF2を含む行は数千行にまたがるため、手動で計算することは困難です。)

(非常に小さい)エラーなしでこれらの行を抽出するのに役立つアルゴリズムを考えることができる人はいますか?これが基本的なものであることはわかりますが、すべての行を抽出するのに正規表現の技術が十分ではないことが心配です。

ベストアンサー1

これにより、列9が一致するすべての行が提供されますMEF2

awk -F"\t" '$9~/MEF2/' file > output

ファイルが次のようになるとします。いつもタブで区切ると機能し、安心できます。これは、得られる誤差制限がゼロに近いです。

ただし、Rなどの項目を取得しようとしましたが(おそらくを使用してread.table("file",sep="\t"))機能しない場合は、フィールド数が異なるいくつかの行がある可能性があります(確認方法については最後を参照)。その場合、常に最後のフィールドに興味があると仮定すると、フィールドの数に関係なく、$(NF)inを使用して最後のフィールドを印刷できます。awk

awk -F"\t" '$(NF)~/MEF2/' file > output

それでも確認が必要だと思われる場合は、MEF2一致がどこにあっても、一致する行をすべて抽出して結果を比較できます。

grep MEF2 file > output2

wc一度インポートすると、同じ数の行があることを確認するために使用できます。そうでない場合は、以下を実行して違いを確認してください。

grep -vFf output output2

このコマンドは、出力1にない出力2のすべての行を印刷します。とにかく彼らはMEF2ラインナップのどこかにある可能性がありますが、9回にはそうではありません。 9番目のフィールドにある場合、ファイルはタブで区切られておらず、データに問題があります。


上記の方法はawkおそらく最も簡単な解決策です。しかし、同じことを行う他の解決策は次のとおりです。

  • 真珠

    perl -F"\t" -lane '$F[8]=~/MEF2/ && print' file
    
  • sed(9つ以上のフィールドがある場合、この行は誤った行と一致する可能性があります。)

    sed -n '/\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*/p' file
    
  • grep

    grep -P '^.+?\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*' file
    

これらすべてが同じ出力を生成しない場合は、ファイルに問題がある可能性があります。確認できるもう1つのことは、すべての行に9つのフィールドがあることを確認することです。それ以外の場合は問題があります。

awk -F"\t" 'NF!=9' file

上記のコードは、9つのタブで区切られたフィールドを含まないすべての行を印刷します。出力があると、印刷される行に問題があるのです。

おすすめ記事