grep
lui-même est capable de le faire. Utilisez simplement le drapeau -f
:
grep -f <patterns> <file>
<patterns>
est un fichier contenant un motif dans chaque ligne ; et <file>
est le fichier dans lequel vous souhaitez rechercher des éléments.
Notez que, pour forcer grep
pour considérer chaque ligne comme un motif, même si le contenu de chaque ligne ressemble à une expression régulière, vous devez utiliser le drapeau -F, --fixed-strings
.
grep -F -f <patterns> <file>
Si votre fichier est un CSV, comme vous l'avez dit, vous pouvez :
grep -f <(tr ',' '\n' < data.csv) <file>
A titre d'exemple, considérons le fichier "a.txt", avec les lignes suivantes :
alpha
0891234
beta
Maintenant, le fichier "b.txt", avec les lignes :
Alpha
0808080
0891234
bEtA
La sortie de la commande suivante est :
grep -f "a.txt" "b.txt"
0891234
Vous n'avez pas du tout besoin de for
-boucle ici ; grep
offre lui-même cette fonctionnalité.
Maintenant, en utilisant vos noms de fichiers :
#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"
Vous pouvez modifier ','
au séparateur que vous avez dans votre fichier.
Autre solution :
- utiliser
awk
et créez votre proprehash
(par exemple ahash), tous contrôlés par vous-même. - remplacer
$0 to $i
et vous pouvez faire correspondre tous les champs que vous voulez.
awk -F"," '
{
if (nowfile==""){ nowfile = FILENAME; }
if(FILENAME == nowfile)
{
hash[$0]=$0;
}
else
{
if($0 ~ hash[$0])
{
print $0
}
}
} ' xx yy