Eu acho que você quis dizer grep -f
não grep -F
, mas você realmente precisa de uma combinação de ambos e -w
:
grep -Fwf ids.csv table.csv
A razão pela qual você estava obtendo falsos positivos é (eu acho que você não explicou) porque se um id puder ser contido em outro, ambos serão impressos. -w
remove esse problema e -F
garante que seus padrões sejam tratados como sequências, não como expressões regulares. De man grep
:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either be
at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the end
of the line or followed by a non-word constituent character.
Word-constituent characters are letters, digits, and the
underscore.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
Se seus falsos positivos forem porque um ID pode estar presente em um campo que não seja de ID, faça um loop no seu arquivo:
while read pat; do grep -w "^$pat" table.csv; done < ids.csv
ou mais rápido:
xargs -I {} grep "^{}" table.csv < ids.csv
Pessoalmente, eu faria isso em perl
:
perl -lane 'BEGIN{open(A,"ids.csv"); while(<A>){chomp; $k{$_}++}}
print $_ if defined($k{$F[0]}); ' table.csv