web-dev-qa-db-fra.com

recherche du contenu d'un fichier dans un autre fichier dans un script Shell Unix

J'utilise le script suivant pour trouver le contenu d'un fichier dans un autre:

#!/bin/ksh
file="/home/nimish/contents.txt"

while read -r line; do
    grep $line /home/nimish/another_file.csv
done < "$file"

J'exécute le script mais il n'affiche pas le contenu du fichier csv. Mon fichier contents.txt contient des numéros tels que "08915673" ou "123223" qui sont également présents dans le fichier csv. Y a-t-il quelque chose de mal que je fais?

9
NIMISH DESHPANDE

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 effectuer une recherche.

Notez que, pour forcer grep à considérer chaque ligne comme un motif, même si le contenu de chaque ligne ressemble à une expression régulière, vous devez utiliser l'indicateur -F, --fixed-strings.

grep -F -f <patterns> <file>

Si votre fichier est un fichier CSV, comme vous l'avez dit, vous pouvez procéder comme suit:

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

Le résultat de la commande suivante est:

grep -f "a.txt" "b.txt"
0891234

Vous n'avez pas du tout besoin de for- boucle ici; grep lui-même offre 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 remplacer ',' par le séparateur que vous avez dans votre fichier.

29
Rubens

Une autre solution:

  • utilisez awk, créez votre propre hash (par exemple, ahash), le tout par vous-même. 
  • remplacer $0 to $i, 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
2
sharingli

Je ne pense pas que vous ayez vraiment besoin d'un script pour exécuter ce que vous essayez de faire. 

Une commande suffit. Dans mon cas, il me fallait un numéro d'identification dans la colonne 11 d'un fichier csv (avec ";" comme séparateur)

grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv 

J'espère que ça aide. 

1
Philippe Delteil