从文件中删除未出现在另一个文件中的行,错误

时间:2016-07-25 14:26:11

标签: linux file awk compiler-errors command

我有两个文件,类似于下面的文件:

文件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个字符的识别,这可能是错误吗?

由于

1 个答案:

答案 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一样。