首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个文件中查找和计数ID列的匹配数据?

如何在两个文件中查找和计数ID列的匹配数据?
EN

Unix & Linux用户
提问于 2020-01-31 10:57:56
回答 2查看 568关注 0票数 2

我有两个遗传数据集有匹配的染色体位置ID。我想数一下文件1's染色体位置in出现在文件2中的次数。

例如,我的数据看起来如下:

文件1(染色体位置实际上是我的第125栏,由...暗示):

代码语言:javascript
复制
Gene  pval    ... Chromosome position ID
ACE   0.002   ... 01:3290834_CT_C_1
NOS   0.01    ... 03:3304593_GA_G_1
BRCA  0.004 . ... 06:6265733_GA_G_1
CYP3  0.34    ... 09:9433933_GA_G_1

文件2(染色体位置是我的第一栏):

代码语言:javascript
复制
Chromosome position ID  Gene  pval
01:1243933_GA_G_1       ACE   0.002
03:3304593_GA_G_1       NOS   0.01
06:6265733_GA_G_1       BRCA  0.004
09:9433933_GA_G_1       CYP3  0.34

我已经发现了很多问题,给出了匹配线的提取,并根据这些问题应用了代码,但我只想得到两个文件之间的染色体匹配位置的计数。

目前我正在使用:

代码语言:javascript
复制
awk -F'|' 'NR==FNR{c[$125]++;next};c[$125]' file2.csv file1.txt > file3.txt

wc -l file1.txt
wc -l file3.txt

文件1和3的行数与我所期望的不完全匹配(我希望所有的文件1都在文件2中),为了确定发生了什么,我需要找到一种方法来执行染色体位置列中匹配行的计数。如果我能找到一种方法来编码‘所有的1号文件染色体位置是否匹配/出现在文件3?’这将是理想的,但即使只是一个计数,就目前而言是可行的。

因此输出将是一个数,数多少倍染色体位置列$125在文件1中也与文件2染色体位置列$1相匹配。

我正在使用Linux。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2020-01-31 11:27:22

awktailsortjoinwc的解决方案。

代码语言:javascript
复制
join <(awk -F '\t' '{print $125}' file1 | tail -n +2 | sort) <(awk -F '\t' '{print $1}' file2 | tail -n +2 | sort ) | wc -l
3

解释一下。

此解决方案假定列为制表符分隔。使用awk收集了file1的第125列和file2的第一列。tail -n +2移除收集的结果的第一行。sort是强制性的,因为join需要有序的文件。结果的相交集被提供给wc,后者返回它的行数。

票数 2
EN

Unix & Linux用户

发布于 2020-01-31 11:21:05

你离我很近。试一试

代码语言:javascript
复制
awk 'FNR == 1 {next}; FNR==NR {P[$125]; next} $1 in P {P[$1]++} END {for (p in P) print p, P[p]+0}' file[12]
03:3304593_GA_G_1 1
01:3290834_CT_C_1 0
09:9433933_GA_G_1 1
06:6265733_GA_G_1 1

显然,并非file1中的所有位置都在file2中。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/565089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档