“Ungrep” - quais padrões não são compatíveis

13

Estou procurando um comando ou script para fazer o seguinte: dado:

arquivo1.txt:

abcd
efgh 
ijkl
mnop

arquivo2.txt:

123abcd123
123efgh123
123mnop123

Eu quero um comando que faça algo assim:

ungrep file1.txt file2.txt

e retorna o seguinte:

ijkl

Em outras palavras, ele está me fornecendo as linhas em file1.txt que não retornarão nenhum resultado em um grep de file2.txt. Eu sei que posso fazer isso iterando através de file1.txt, digitando file2.txt para cada linha e armazenando o resultado, e exibindo quaisquer linhas onde o resultado está vazio, mas eu estava esperando por uma maneira mais eficiente de fazer isso. / p>     

por Edward Shtern 20.06.2013 / 19:33

2 respostas

18

Com o GNU grep , o seguinte deve funcionar. Usando a opção -f , passe file1.txt como um "arquivo padrão" - mas também passe-a pela segunda vez como um arquivo de dados. Use -o para relatar apenas as partes correspondentes. Finalmente, extrai as palavras que correspondem apenas uma vez - elas correspondem às linhas de file1.txt que não encontram uma correspondência em file2.txt .

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl
    
por 20.06.2013 / 19:43
10

Você poderia fazer isso com awk como:

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

Usando index , procuramos substrings em vez de corresponder a expressões regulares.

Como excluímos a palavra da matriz assim que encontramos uma correspondência, evitamos pesquisas desnecessárias.

    
por 20.06.2013 / 21:09

Tags