Usando o grep para remover linhas de um arquivo que contém uma string de outro arquivo

4

Eu tenho um arquivo contendo palavras (uma por linha), como

Dog
Fish
Cat
Shoes

Eu tenho um arquivo secundário no formato CSV, como

1,shoes,red
2,apple,black
3,fog,blue

Eu gostaria de usar o grep com o primeiro arquivo sendo o padrão de busca, se uma linha no arquivo secundário contiver uma palavra no primeiro arquivo, eu gostaria de remover completamente a linha no arquivo secundário.

Não tenho certeza se o grep é o melhor caminho para isso.

EDITAR: bash scripting

    
por Jason Yost 10.05.2013 / 20:40

1 resposta

9

Você pode fazer isso usando a opção grep de -f (que é minúscula -f , não -F ):

% echo -e 'Dog\nFish\nCat\nShoes' > ./file1.txt 
% echo -e '1,shoes,red\n2,apple,black\n3,fog,blue' > ./file2.csv 

# Grab all lines from the CSV that match a pattern from file1:
% grep -if ./file1.txt ./file2.csv
1,shoes,red

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv
2,apple,black
3,fog,blue

Explicação detalhada:

  • grep - auto-explicativo
  • -v - significa 'linhas de retorno que não correspondem ao padrão de entrada'
  • -i - significa 'usar correspondência sem distinção entre maiúsculas e minúsculas' (já que seu primeiro arquivo tinha letras maiúsculas e o CSV não tinha)
  • -f - significa interpretar cada linha no arquivo especificado ( file1.txt ) como um padrão a ser usado para correspondência '

Dependendo dos resultados desejados e do conteúdo de seus arquivos, você também pode ler as opções -F e -w .

Se você precisar editar o arquivo no local, acho que pode fazer isso com a opção sed -f , mas sed interpreta cada linha do arquivo como um comando, em vez de um padrão simples como grep faz.

    
por 10.05.2013 / 21:51