![如何查找并统计两个文件中ID列的匹配数据?](https://linux22.com/image/13597/%E5%A6%82%E4%BD%95%E6%9F%A5%E6%89%BE%E5%B9%B6%E7%BB%9F%E8%AE%A1%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%ADID%E5%88%97%E7%9A%84%E5%8C%B9%E9%85%8D%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
我有两个遗传数据集,它们具有匹配的染色体位置 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
具有、tail
、sort
和join
的解决方案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 中找到。