用于查找和打印两个文件之间的通用 ID 的脚本有效,但不是最佳的



我有一个正在运行的代码,可以执行我想要的操作,但速度非常慢。这需要1或2天的时间,具体取决于输入文件的大小。我知道有一些替代方案几乎是即时的,而且我的代码很慢,因为它是递归grep。我用python写了另一个代码,它按预期工作,几乎是即时的,但它并没有打印出我需要的所有内容。我需要的是两个文件之间的通用ID,我希望它能打印整行。我的python脚本没有做到这一点,而bash做到了,但速度太慢了。

这是我在bash:中的代码

awk '{print $2}'  file1.bim > sites.txt 
for snp in `cat sites.txt`
do
grep -w $snp file2.bim >> file1_2_shared.txt
done

这是我在python中的代码:

#!/usr/bin/env python3
import sys
argv1=sys.argv[1]   #argv1 is the first .bim file
argv2=sys.argv[2]   #argv2 is the second .bim file
argv3=sys.argv[3]   #argv3 is the output .txt file name
def printcommonSNPs(inputbim1,inputbim2,outputtxt):
bim1 = open(inputbim1, "r")
bim2 = open(inputbim2, "r")
output = open(outputtxt,"w")

snps1 = []
line1 = bim1.readline()
line1 = line1.split()
snps1.append(line1[1])
for line1 in bim1:
line1 = line1.split()
snps1.append(line1[1])
bim1.close()

snps2 = []
line2 = bim2.readline()
line2 = line2.split()
snps2.append(line2[1])
for line2 in bim2:
line2 = line2.split()
snps2.append(line2[1])
bim2.close()
common=[]
common = list(set(snps1).intersection(snps2))

for SNP in common:
print(SNP, file=output)

printcommonSNPs(argv1,argv2,argv3)

我的.bim输入文件是这样制作的:

1   1:891021    0   891021  G   A
1   1:903426    0   903426  T   C
1   1:949654    0   949654  A   G

我很感激关于如何在bash中快速打印的建议(我怀疑我可以使用awk脚本,但我尝试了awk 'FNR==NR {map[$2]=$2; next} {print $2, map[$2]}' file1.bim file2.bim > Roma_sets_shared_sites.txt,它只是打印每一行,所以它不能按我的需要工作(,或者我如何在python3中打印整行。

看起来问题可以这样解决:

grep -w -f <(awk '{ print $2 }' file1.bim) file2.bim

来自file1.bim的标识符(字段$2(将被视为在file2.bim中grep的模式。GNUgrep采用-f file参数,该参数给出一个模式列表,每行一个。我们使用<()进程替换来代替文件。看起来-w选项似乎单独应用于-f模式。

如果file1.bim中有重复的ID,那么它将不会具有与shell脚本相同的输出。如果相同的模式出现多次,则与一个实例相同。当然,顺序是不同的。为一个标识符填充整个第二个文件,然后为下一个和下一个填充,以不同的顺序生成匹配。如果必须复制该命令,将需要额外的工作。

最新更新