我有两个文件,类似于下面的文件:
文件1 - 带有表型信息,第一列是个体,orinal文件有400行:
215 2 25 13.8354303 15.2841303
222 2 25.2 15.8507278 17.2994278
216 2 28.2 13.0482192 14.4969192
223 11 15.4 9.2714745 11.6494745
文件2 - 使用SNP信息,原始文件有400行,每行42,000个字符。
215 20211111201200125201212202220111202005111102
222 20111011212200025002211001111120211015112111
216 20210005201100025210212102210212201005101001
223 20222120201200125202202102210121201005010101
217 20211010202200025201202102210121201005010101
218 02022000252012021022101212010050101012021101
我需要从文件2中删除未出现在文件1中的个人,例如:
215 20211111201200125201212202220111202005111102
222 20111011212200025002211001111120211015112111
216 20210005201100025210212102210212201005101001
223 20222120201200125202202102210121201005010101
我可以使用此代码执行此操作:
awk 'NR==FNR{a[$1]; next}$1 in a{print $0}' file1 file2> file3
但是,当我使用生成的文件进行主要分析时,会出现以下错误:
*** Error in `./airemlf90': free(): invalid size: 0x00007f5041cc2010 ***
*** Error in `./postGSf90': free(): invalid size: 0x00007fec4a04f010 ***
airemlf90和postGSf90是软件。但是当我使用原始文件时,不会发生此问题。我删除个人的命令是否足够?另一个没有说明的细节是有些人有4个字符的识别,这可能是错误吗?
由于
答案 0 :(得分:1)
我在几分钟内写了一个小python脚本。效果很好,我已经测试了42000-char线,它工作正常。
import sys,re
# rudimentary argument parsing
file1 = sys.argv[1]
file2 = sys.argv[2]
file3 = sys.argv[3]
present = set()
# first read file 1, discard all fields except the first one (the key)
with open(file1,"r") as f1:
for l in f1:
toks = re.split("\s+",l) # same as awk fields
if toks: # robustness against empty lines
present.add(toks[0])
#now read second one and write in third one only if id is in the set
with open(file2,"r") as f2:
with open(file3,"w") as f3:
for l in f2:
toks = re.split("\s+",l)
if toks and toks[0] in present:
f3.write(l)
(首先安装python,如果尚未存在。)
调用我的示例脚本mytool.py
并按如下方式运行:
python mytool.py file1.txt file2.txt file3.txt
要简单地在bash文件中处理多个文件(以替换原始解决方案),这很简单(虽然不是最佳的,因为可以在python中进行旋转)
<whatever the for loop you need>; do
python my_tool.py $1 $2 $3
done
就像你用3个文件调用awk一样。