我有两个遗传数据集有匹配的染色体位置ID。我想数一下文件1's染色体位置in出现在文件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?’这将是理想的,但即使只是一个计数,就目前而言是可行的。
因此输出将是一个数,数多少倍染色体位置列$125在文件1中也与文件2染色体位置列$1相匹配。
我正在使用Linux。
发布于 2020-01-31 11:27:22
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,后者返回它的行数。
发布于 2020-01-31 11:21:05
你离我很近。试一试
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中。
https://unix.stackexchange.com/questions/565089
复制相似问题