我有两个文件,我想删除文件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。
提前感谢您的帮助。
答案 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 -nr '/^$/!{s/\S+\s+(\S+).*/\\([[:alnum:]]\\+[^[:alnum:]]\\+\\)\\{2\\}\1[^[:alnum:]]\\+.*/;p}' file2>file3
grep -f file3 file1>output
答案 4 :(得分:0)
使用vim的一种解决方案。您可以购买一些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