如果文件1中的列A不等于文件2中的列B,则删除行

时间:2013-06-10 13:01:12

标签: python linux awk

我有两个文件,我想删除文件1中的行,其中文件1的第3列不等于文件2的第2列。

文件1看起来像

1111    1111    exm-IND1-200449980  I   I

1111    1111    exm-IND1-201453487  I   I

1111    1111    rs4477212   A   A

1111    1111    rs3094315   A   A

1111    1111    exm-IND11-102094357 D   D

文件2看起来像

1   rs4477212   0   82154

1   rs3094315   0   752566

1   rs3131972   0   752721

1   exm2268640  0   762320

1   rs12562034  0   768448

所需的文件输出将是

1111    1111    rs4477212   A   A

1111    1111    rs3094315   A   A

文件1是2.4GB,文件2是21.8MB。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:9)

awk 'NR==FNR {f2[$2]; next} $3 in f2' file2 file1

答案 1 :(得分:2)

如果您想从File1中删除其中col3不等于File2的col2的行,那么以下操作将会起作用:

awk 'NR==FNR{a[$2];next}($3 in a)&&NF' file2 file1 > output.txt

答案 2 :(得分:1)

python中的解决方案:

import os
with open('file1') as f1, open('file2') as f2, open('f3', 'w') as f3:
    s = set(line.split()[1] for line in f2 if line.strip())
    for line in f1:
        if line.strip() and line.split()[2] in s:
            f3.write(line)
os.rename('f3', 'file1')
print (open('file1').read())

<强>输出:

1111    1111    rs4477212   A   A
1111    1111    rs3094315   A   A

答案 3 :(得分:1)

sed&amp; grep的

sed -nr '/^$/!{s/\S+\s+(\S+).*/\\([[:alnum:]]\\+[^[:alnum:]]\\+\\)\\{2\\}\1[^[:alnum:]]\\+.*/;p}' file2>file3
grep -f file3 file1>output

答案 4 :(得分:0)

使用的一种解决方案。您可以购买一些RAM内存并尝试一下。

script.vim的内容:

set backup
let d = {}
buffer 2
for l in range( 1, line('$') )
    let d[ split( getline(l) )[1] ] = 1 
endfor
buffer 1
for l in reverse( range( 1, line('$') ) ) 
    if ! has_key( d, split( getline(l) )[2] )
        execute l . 'delete'
    endif
endfor
saveas! output.txt
qall!

像以下一样运行:

vim -u NONE -N -S script.vim file1 file2

它将创建一个包含内容的文件output.txt

1111    1111    rs4477212   A   A
1111    1111    rs3094315   A   A