0

我有两个文件,我想从文件 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。

预先感谢您的帮助。

4

5 回答 5

9
awk 'NR==FNR {f2[$2]; next} $3 in f2' file2 file1
于 2013-06-10T13:09:50.370 回答
2

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

awk 'NR==FNR{a[$2];next}($3 in a)&&NF' file2 file1 > output.txt
于 2013-06-10T13:12:32.883 回答
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
于 2013-06-10T13:13:02.137 回答
1

sed 和 grep

sed -nr '/^$/!{s/\S+\s+(\S+).*/\\([[:alnum:]]\\+[^[:alnum:]]\\+\\)\\{2\\}\1[^[:alnum:]]\\+.*/;p}' file2>file3
grep -f file3 file1>output
于 2013-06-10T13:48:08.593 回答
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
于 2013-06-10T13:45:49.187 回答