-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-w, --word-regexp
Select only those lines containing matches that form
whole words.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line.
Então, combinado, grep -vwf patternFile inputFilesignifica "encontre aquelas linhas de patternFile que nunca estão presentes como palavras inteiras em inputFile".
<(command): isso é chamado de substituição de processo e, nos shells que o suportam (por exemplo, bash), ele funcionará essencialmente como um arquivo. Isso nos permite usar a saída do cutcomando como um "arquivo" para a -fopção do grep.
cut -d, -f1 file1: imprime apenas o 1º campo separado por vírgulas do arquivo1.
Observe que você pode querer usar -x(corresponder a linha inteira) em vez de apenas -wse seus dados forem realmente como você mostra:
-x, --line-regexp
Select only those matches that exactly match the whole line.
Então:
$ grep -vxf <(cut -d, -f1 file1) file2
test4
Além disso, se você file1puder conter quaisquer caracteres de expressão regular ( ., *, ?etc.), convém usar -Ftambém:
-F, --fixed-strings
Interpret PATTERNS as fixed strings, not regular expressions.
cut -d',' -f1 file1imprime o primeiro campo de file1e grepestá usando a saída como arquivo de entrada padrão (opção -f). As opções -Fe -xsão usadas para combinar strings fixas e linhas inteiras e -vinverter as correspondências.
Você pode usar
grep
para isso:Explicação
grep
opções:Então, combinado,
grep -vwf patternFile inputFile
significa "encontre aquelas linhas de patternFile que nunca estão presentes como palavras inteiras em inputFile".<(command)
: isso é chamado de substituição de processo e, nos shells que o suportam (por exemplo, bash), ele funcionará essencialmente como um arquivo. Isso nos permite usar a saída docut
comando como um "arquivo" para a-f
opção do grep.cut -d, -f1 file1
: imprime apenas o 1º campo separado por vírgulas do arquivo1.Observe que você pode querer usar
-x
(corresponder a linha inteira) em vez de apenas-w
se seus dados forem realmente como você mostra:Então:
Além disso, se você
file1
puder conter quaisquer caracteres de expressão regular (.
,*
,?
etc.), convém usar-F
também:Então:
Usando
cut
egrep
:cut -d',' -f1 file1
imprime o primeiro campo defile1
egrep
está usando a saída como arquivo de entrada padrão (opção-f
). As opções-F
e-x
são usadas para combinar strings fixas e linhas inteiras e-v
inverter as correspondências.Este é apenas um exemplo que recebo da minha lista de exemplos, você pode usá-lo para solucionar suas próprias necessidades.
Uma
awk
possibilidade assumindo que o primeiro campofile1
contém o nome do arquivo e o separador de campo é sempre um,
(Veja a versão simplificada do @Terdon nos comentários e depois combine com a minha
)
Uso alternativo
join
Para exatamente essa configuração,
vai fazer. Mas - esteja ciente de, por exemplo, falsos positivos que precisariam de medidas adicionais a serem tomadas.