it-swarm.com.de

suchen von Inhalten einer Datei in einer anderen Datei in einem Unix-Shell-Skript

Ich verwende folgendes Shell-Skript, um den Inhalt einer Datei in eine andere zu finden:

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

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

Ich führe das Skript aus, zeigt jedoch nicht den Inhalt der CSV-Datei an. Meine Datei contents.txt enthält eine Nummer wie "08915673" oder "123223", die auch in der csv-Datei enthalten ist. Gibt es irgendetwas, was ich falsch mache?

9

grep selbst ist dazu in der Lage. Verwenden Sie einfach die Flagge -f:

grep -f <patterns> <file>

<patterns> ist eine Datei mit einem Muster in jeder Zeile. und <file> ist die Datei, in der Sie Dinge suchen möchten.

Um grep zu zwingen, jede Zeile als Muster zu betrachten, sollten Sie das Flag -F, --fixed-strings verwenden, auch wenn der Inhalt jeder Zeile wie ein regulärer Ausdruck aussieht.

grep -F -f <patterns> <file>

Wenn es sich bei Ihrer Datei um eine CSV-Datei handelt, können Sie wie folgt vorgehen:

grep -f <(tr ',' '\n' < data.csv) <file>

Betrachten Sie als Beispiel die Datei "a.txt" mit den folgenden Zeilen:

alpha
0891234
beta

Nun die Datei "b.txt" mit den Zeilen:

Alpha
0808080
0891234
bEtA

Die Ausgabe des folgenden Befehls lautet:

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

Sie brauchen hier überhaupt keine for-Schleife; grep selbst bietet diese Funktion an.


Jetzt mit deinen Dateinamen:

#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"

Sie können ',' in das Trennzeichen ändern, das Sie in Ihrer Datei enthalten.

29
Rubens

Eine andere Lösung:

  • verwenden Sie awk, erstellen Sie Ihre eigene hash (z. B. ahash), die alle von Ihnen selbst gesteuert wird. 
  • $0 to $i ersetzen, können Sie beliebige Felder zuordnen.

awk -F"," '
{  
   if (nowfile==""){ nowfile = FILENAME;  }

   if(FILENAME == nowfile)
   {
     hash[$0]=$0;
   }
   else
   {
       if($0 ~ hash[$0])
       {  
           print $0
       }
   }
} '  xx yy
2
sharingli

Ich glaube nicht, dass Sie wirklich ein Skript benötigen, um das auszuführen, was Sie versuchen. 

Ein Befehl ist genug. In meinem Fall brauchte ich eine Identifikationsnummer in Spalte 11 in einer CSV-Datei (mit ";" als Trennzeichen)

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

Ich hoffe das hilft. 

1