OK de uma forma ruby: se você tiver uma lista de strings em um arquivo, e você quiser remover todas as linhas de outro arquivo que contenham qualquer cadeia no primeiro arquivo (neste caso, removendo "arquivo2" de "arquivo1") arquivo rubi:
b=File.read("file2").split # subtract this one out
remove_regex = Regexp.new(b.join('|'))
File.open("file1", "r").each_line do |line|
if line !~ remove_regex
puts line
end
end
infelizmente, com um grande arquivo "to remove", isso parece degradar a complexidade para O (N ^ 2) (minha suposição é que o regexp tem muito trabalho a fazer), mas ainda pode ser útil para alguém por aí (se você quiser mais do que remover linhas inteiras). Pode ser mais rápido em certos casos.
Outra opção, se você está indo para velocidade, é usar o mesmo mecanismo de verificação de hash, mas cuidadosamente "analisar" a linha para seqüências de caracteres que podem corresponder e, em seguida, compará-las com o hash.
Em ruby, pode ser assim:
b=File.read("file2").split # subtract this one out
hash={}
for line in b
hash[line] = 1
end
ARGF.each_line do |line|
ok = true
for number in line.scan(/\d{9}/)
if hash.key? number
ok=false
end
end
if (ok)
puts line
end
end
Veja também a resposta de Scott, é semelhante às respostas awk propostas aqui para cá, e evita a complexidade de O (N ^ 2) (ufa).