Estou procurando um comando ou script para fazer o seguinte - dado:
file1.txt:
abcd
efgh
ijkl
mnop
file2.txt:
123abcd123
123efgh123
123mnop123
Eu quero um comando que faça algo parecido com isto:
ungrep file1.txt file2.txt
e retorna o seguinte:
ijkl
Em outras palavras, ele está fornecendo as linhas no arquivo1.txt que não retornarão nenhum resultado em um grep do arquivo2.txt. Eu sei que posso fazer isso iterando através de file1.txt, grepping file2.txt para cada linha e armazenando o resultado e emitindo todas as linhas em que o resultado está vazio, mas eu esperava uma maneira mais eficiente de fazer isso.
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
mas, como sua solução, isso só funciona quando o arquivo padrão não contém metacaracteres de expressão regular.grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Você poderia fazê-lo com
awk
:Ao usar
index
, procuramos substrings em vez de corresponder expressões regulares.Como excluímos a palavra da matriz assim que encontramos uma correspondência, evitamos pesquisas desnecessárias.
fonte
w[$0]
tenha o efeito colateral de adicionar a chave à matriz.if (a[$1])
vez de,if ($1 in a)
por exemplo. É o caso de todos,awk
incluindo o originalawk
enawk
, mas olhando para o padrão de ontem, não consegui encontrá-lo especificado.file1
não seja grande (por algum valor enorme), eu preferiria essa solução, pois não requer nenhuma classificaçãofile2
e seria muito mais eficiente.