2017-07-21 7 views
0

わかりましたので、私は私と一緒に負担してください、この種のものにかなり新しいです。第二のファイルからIDを持つテキストファイルのフィルタテーブル

search_results_accesions.txtは、識別子のリストである1行に1つずつ:

私は2つのファイルを持っています。

$ more search_results_accessions.txt 
NP_000020.1 
NP_000026.2 
NP_000027.2 
NP_000029.2 
NP_000034.1 
NP_000042.3 
NP_000056.2 
NP_000063.2 
NP_000065.1 
NP_000068.1 
NP_000088.3 
NP_000112.1 
NP_000117.1 
NP_000147.1 
NP_000156.1 
NP_000167.1 
NP_000205.1 
NP_000228.1 
NP_000241.1 
NP_000305.3 
NP_000347.2 
NP_000354.4 
NP_000370.2 

prot.accession2taxid.txtは(私のリストではなく、多くの、より多くの)識別子のそれぞれをリストするファイルです。それは、この(ないすべての識別子のが「NP_」で開始されることに注意してください)のように見えます対応するtaxidを与えます。ここで(3列目はtaxid Sが含まれている)それは次のようになります。

$ more prot.accession2taxid 
accession  accession.version  taxid gi 
APZ74649  APZ74649.1  36984 1137646701 
AQT41667  AQT41667.1  1686310 1150388099 
WP_080502060 WP_080502060.1 95486 1169627919 
ASF53620  ASF53620.1  492670 1211447116 
ASF53621  ASF53621.1  492670 1211447117 
ASF53622  ASF53622.1  492670 1211447118 
ASF53623  ASF53623.1  492670 1211447119 
ASF53624  ASF53624.1  492670 1211447120 
ASF53625  ASF53625.1  492670 1211447121 
ASF53626  ASF53626.1  492670 1211447122 
ASF53627  ASF53627.1  492670 1211447123 
ASF53628  ASF53628.1  492670 1211447124 
ASF53629  ASF53629.1  492670 1211447125 
ASF53630  ASF53630.1  492670 1211447126 
ASF53631  ASF53631.1  492670 1211447127 
ASF53632  ASF53632.1  492670 1211447128 
ASF53633  ASF53633.1  492670 1211447129 
APZ74650  APZ74650.1  36984 1137646703 
APZ74651  APZ74651.1  36984 1137646705 
APZ74652  APZ74652.1  36984 1137646707 
APZ74653  APZ74653.1  36984 1137646709 
APZ74654  APZ74654.1  36984 1137646711 

フィールドはタブで区切られています。

私はsearchresults_accessions.txtファイルにそれぞれaccessiontaxidを取得する必要があります。私はUnixシステムを使用しており、できる限りコマンドラインまたはPythonを使用する方が好きです。

+0

はprot.accession2taxidで区切られていますか? – wpercy

+0

はい、タブ区切りです! –

+1

あなたのQを編集して、search_results_accessionsの最初の要素だけに期待される出力を表示してください。txt(それに一致するデータがあります)。あなたは 'NP_'をトリミングしていますか?末尾の10進値(つまり、 '.1')はどうですか?あなたの最初のデータセットと2番目のデータセットの間に一致が見当たりません。がんばろう。 – shellter

答えて

0

はここ(あなたがコマンドラインやPythonを言ったの)awkとソリューションです:

awk 'NR==FNR {ids[$1]=1} NR>FNR && ($1 in ids) {print $1 "\t" $3}' accessions taxids 

説明:我々は、デフォルトのセパレータ(スペースまたはタブ)

  • を使用して入力行を分割

    • 最初にaccessionsファイルを読み込み、最初のファイルの行についてはtaxids
    • を読み込みます(読み取られたレコードの総数はt o現在のファイルからのレコード数NR==FNR)、最初の列の値を連想マップids
    • の2番目のファイルの行に追加し、最初と3番目のフィールドをタブ文字で区切って出力します。最初のフィールドの値がアクセスマップのマップに存在する場合のみ
  • +0

    こんにちは、私はあなたのコマンドを実行し、それは私にそれにテキストがない出力を与えた。 grepを使って、いくつかのアクセッションが実際にタクシーファイルにあることを確認しました。何か案は? –

    +0

    これらのサンプル入力ファイルと予想される出力を含めるように質問を編集できますか? – randomir

    +0

    @m_breuerまた、私のスクリプトは、検索された値が2番目のファイルの**最初の**フィールド/列にあると仮定しています。これが当てはまらない場合(Julienの回答のように)、 '$ 1 in'の '$ 1'を必要な列に変更してください。 – randomir

    1

    ここにはPythonとpandasモジュールを使用したソリューションがあります。

    これを機能させるためにファイルを少し変更しました(最初のファイルの先頭に列名を追加し、2番目のファイルの複数のタブを1つのタブで置き換えました)。

    accession.version 
    NP_000020.1 
    NP_000026.2 
    NP_000027.2 
    NP_000029.2 
    NP_000034.1 
    NP_000042.3 
    NP_000056.2 
    NP_000063.2 
    NP_000065.1 
    NP_000068.1 
    NP_000088.3 
    NP_000112.1 
    NP_000117.1 
    NP_000147.1 
    NP_000156.1 
    NP_000167.1 
    NP_000205.1 
    NP_000228.1 
    NP_000241.1 
    NP_000305.3 
    NP_000347.2 
    NP_000354.4 
    NP_000370.2 
    

    file2.txt:あなたは、次のファイルfile1.txtを持っていると仮定すると

    accession accession.version taxid gi 
    APZ74649 APZ74649.1 36984 1137646701 
    AQT41667 AQT41667.1 1686310 1150388099 
    WP_080502060 WP_080502060.1 95486 1169627919 
    ASF53620 ASF53620.1 492670 1211447116 
    ASF53621 ASF53621.1 492670 1211447117 
    ASF53622 ASF53622.1 492670 1211447118 
    ASF53623 ASF53623.1 492670 1211447119 
    ASF53624 ASF53624.1 492670 1211447120 
    ASF53625 ASF53625.1 492670 1211447121 
    ASF53626 ASF53626.1 492670 1211447122 
    ASF53627 ASF53627.1 492670 1211447123 
    ASF53628 ASF53628.1 492670 1211447124 
    NP_000088 NP_000088.3 62163 3543665822 
    ASF53629 ASF53629.1 492670 1211447125 
    ASF53630 ASF53630.1 492670 1211447126 
    ASF53631 ASF53631.1 492670 1211447127 
    ASF53632 ASF53632.1 492670 1211447128 
    ASF53633 ASF53633.1 492670 1211447129 
    APZ74650 APZ74650.1 36984 1137646703 
    APZ74651 APZ74651.1 36984 1137646705 
    APZ74652 APZ74652.1 36984 1137646707 
    APZ74653 APZ74653.1 36984 1137646709 
    APZ74654 APZ74654.1 36984 1137646711 
    NP_000117 NP_000117.1 65683 3543634522 
    

    あなたは、次の操作を行うことができます

    import pandas as pd 
    df1 = pd.read_csv('file1.txt', delimiter='\t') 
    df2 = pd.read_csv('file2.txt', delimiter='\t') 
    df = df1.merge(df2) 
    
    #  accession.version accession taxid   gi 
    # 0  NP_000088.3 NP_000088 62163 3543665822 
    # 1  NP_000117.1 NP_000117 65683 3543634522 
    

    あなただけTAXIDに興味がある場合:

    taxid = df.taxid 
    
    # 0 62163 
    # 1 65683 
    # Name: taxid, dtype: int64 
    
    関連する問題