如何在 unix 中匹配列中的 ID?
How to match ID in column in unix?
我完全知道可能已经发布了类似的问题,但经过搜索,我们的问题细节似乎有所不同(或者至少我没有找到可以在我的案例中采用的解决方案) .
我目前有两个文件:"messyFile" 和 "wantedID"。 "messyFile" 的大小为 80,000,000 X 2,500,而 "wantedID" 的大小为尺寸 1 x 462。在"messyFile"的第253行,有2500个ID。然而,我想要的只是文件"wantedID"中的462个ID。假设 462 个 ID 是 2500 个 ID 的子集,我如何处理文件 "messyFile" 使其仅包含有关 462 个 ID 的信息(即大小 80,000,000 X 462).
非常感谢您的耐心等待!
ps:抱歉造成混淆。但是,是的,这个问题可以归结为这样的事情。 "File#1"第一行有10个ID。 "File#2"第一行有3个ID("File#2"只有1行)。这 3 个 ID 是 10 个 ID 的子集。现在,我希望处理"File#1",使其只包含"File#2"中列出的3个ID的信息。
ps2:"messyFile"是vcf文件,而"wantedID"可以是一个文本文件(我说 "can be" 因为它很小,所以我几乎可以为它制作任何类型)
ps3:"File#1" 应该看起来像这样:
sample#1 sample#2 sample#3 sample#4 sample#5
0 1 0 0 1
1 1 2 0 2
"File#2" 应该看起来像这样:
sample#2 sample#4 sample#5
所需的输出应如下所示:
sample#2 sample#4 sample#5
1 0 1
1 0 2
好的,我不知道什么是 vcf 文件,但如果您提供的文件#1 和文件#2 示例是包含制表符分隔列的文件,这将有效:
declare -a data=(`head -1 data.txt`)
declare -a header=(`head -1 header.txt`)
declare fields
declare -i count
for i in "${header[@]}" ; do
count=0
for j in "${data[@]}" ; do
count=$count+1;
if [ $i == $j ] ; then
fields=$fields,$count
fi
done
done
cut -f ${fields:1} data.txt
如果它们不是制表符分隔值,也许可以针对实际数据格式进行修改。
解析VCF格式,使用bcftools
:
http://samtools.github.io/bcftools/bcftools.html
具体针对您的任务,请参阅 view
命令:
http://samtools.github.io/bcftools/bcftools.html#view
示例:
bcftools view -Ov -S 462sample.list -r chr:pos -o subset.vcf superset.vcf
您需要获取 SNP 的位置以在上面指定 chr:pos
。
您可以使用 DbSNP 执行此操作:
http://www.ncbi.nlm.nih.gov/SNP/index.html
只需确保基因组构建与 VCF 文件中使用的构建相匹配。
你也可以使用plink
:
https://www.cog-genomics.org/plink2
但是,PLINK 对重复的 SNP 和其他事情很挑剔,因此除非您解决这些问题,否则它可能会抱怨。
我已经使用 awk
编程语言完成了您过去尝试的操作。为了您的理智,我建议使用上述工具之一:)
我完全知道可能已经发布了类似的问题,但经过搜索,我们的问题细节似乎有所不同(或者至少我没有找到可以在我的案例中采用的解决方案) .
我目前有两个文件:"messyFile" 和 "wantedID"。 "messyFile" 的大小为 80,000,000 X 2,500,而 "wantedID" 的大小为尺寸 1 x 462。在"messyFile"的第253行,有2500个ID。然而,我想要的只是文件"wantedID"中的462个ID。假设 462 个 ID 是 2500 个 ID 的子集,我如何处理文件 "messyFile" 使其仅包含有关 462 个 ID 的信息(即大小 80,000,000 X 462).
非常感谢您的耐心等待!
ps:抱歉造成混淆。但是,是的,这个问题可以归结为这样的事情。 "File#1"第一行有10个ID。 "File#2"第一行有3个ID("File#2"只有1行)。这 3 个 ID 是 10 个 ID 的子集。现在,我希望处理"File#1",使其只包含"File#2"中列出的3个ID的信息。
ps2:"messyFile"是vcf文件,而"wantedID"可以是一个文本文件(我说 "can be" 因为它很小,所以我几乎可以为它制作任何类型)
ps3:"File#1" 应该看起来像这样:
sample#1 sample#2 sample#3 sample#4 sample#5
0 1 0 0 1
1 1 2 0 2
"File#2" 应该看起来像这样:
sample#2 sample#4 sample#5
所需的输出应如下所示:
sample#2 sample#4 sample#5
1 0 1
1 0 2
好的,我不知道什么是 vcf 文件,但如果您提供的文件#1 和文件#2 示例是包含制表符分隔列的文件,这将有效:
declare -a data=(`head -1 data.txt`)
declare -a header=(`head -1 header.txt`)
declare fields
declare -i count
for i in "${header[@]}" ; do
count=0
for j in "${data[@]}" ; do
count=$count+1;
if [ $i == $j ] ; then
fields=$fields,$count
fi
done
done
cut -f ${fields:1} data.txt
如果它们不是制表符分隔值,也许可以针对实际数据格式进行修改。
解析VCF格式,使用bcftools
:
http://samtools.github.io/bcftools/bcftools.html
具体针对您的任务,请参阅 view
命令:
http://samtools.github.io/bcftools/bcftools.html#view
示例:
bcftools view -Ov -S 462sample.list -r chr:pos -o subset.vcf superset.vcf
您需要获取 SNP 的位置以在上面指定 chr:pos
。
您可以使用 DbSNP 执行此操作:
http://www.ncbi.nlm.nih.gov/SNP/index.html
只需确保基因组构建与 VCF 文件中使用的构建相匹配。
你也可以使用plink
:
https://www.cog-genomics.org/plink2
但是,PLINK 对重复的 SNP 和其他事情很挑剔,因此除非您解决这些问题,否则它可能会抱怨。
我已经使用 awk
编程语言完成了您过去尝试的操作。为了您的理智,我建议使用上述工具之一:)