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
awket créez votre proprehash(par exemple ahash), tous contrôlés par vous-même. - remplacer
$0 to $iet 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