如何查找并统计两个文件中ID列的匹配数据?

如何查找并统计两个文件中ID列的匹配数据?

我有两个遗传数据集,它们具有匹配的染色体位置 ID。我想计算文件 1 的染色体位置 ID 在文件 2 中出现的次数。

例如我的数据如下所示:

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

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(染色体位置是我的第一列):

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

我发现了很多有关提取匹配行的问题,并根据这些问题应用了代码,但我只想获取两个文件之间匹配染色体位置的计数。

目前我正在使用:

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 中?”这将是理想的情况,但目前即使只是计数也可以。

因此,输出将是一个数字,用于计算文件 1 中染色体位置列 $125 与文件 2 染色体位置列 $1 匹配的次数。

我正在使用Linux。

答案1

awk具有、tailsortjoin的解决方案wc

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

你很接近了。尝试

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 中找到。

相关内容