使用来自第二个fi的ID筛选文本文件中的表

2024-06-16 09:54:29 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我对这类事情还不太熟悉,所以请容忍我。你知道吗

我有两个文件:

search_results_accesions.txt是一个标识符列表,每行一个。它看起来是这样的(注意不是所有的标识符都以“NP\”开头):

$ 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是一个文件,它列出了每一个标识符(还有很多很多不在我的列表中的标识符),并给出了相应的taxid。下面是它的样子(第三列包含taxid):

$ 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文件中的每个accession获取taxid。我使用的是Unix系统,如果可能的话,我更喜欢使用命令行或Python。你知道吗


Tags: 文件txt列表searchmorenp标识符事情
2条回答

这里有一个awk的解决方案(您说的是命令行或Python):

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

说明:

  • 我们使用默认分隔符(空格或制表符)拆分输入行
  • 首先我们读取accessions文件,然后taxids
  • 对于第一个文件中的行(虽然读取的记录总数等于当前文件中的记录数,NR==FNR),我们将第一列中的值添加到关联映射ids
  • 对于第二个文件中的行,我们打印第一个和第三个字段,用制表符分隔,但前提是第一个字段中的值出现在我们的登录id映射中

下面是一个使用python和pandas模块的解决方案。你知道吗

为此,我对您的文件做了一些修改(在第一个文件的顶部添加了一个列名,并在第二个文件中将多个选项卡替换为单个选项卡)。假设您有以下文件file1.txt

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

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 = df.taxid

# 0    62163
# 1    65683
# Name: taxid, dtype: int64

相关问题 更多 >