Grep eine Variable in einer Datei

Grep eine Variable in einer Datei

Eine Datei wird durch ein Skript unter Verwendung einer Eingabedatei geändert.

141,141_1,BAR,HONDA,ps2_0,nicht zugewiesen,ps3_0,Nicht zugewiesen,ps4_0,Nicht zugewiesen,ps5_0,Nicht zugewiesen,ps6_0,Nicht zugewiesen,ps7_3,TILL WILL,.....

Eingabedatei-

141,ps7,TILL WILL

Jetzt muss ich suchen, ob die Spalte ps7_3 mit dem richtigen Wert aktualisiert wird.

Also habe ich aus der Eingabedatei die Spalten getrennt-

while read -r line;
do
sub1=$(echo $line|cut -f 1 -d ',');
sub2=$(echo $line|cut -f 2 -d ',');
sub3=$(echo $line|cut -f 3 -d ',');
sub4=$(echo $sub2'.*,'$sub3|sed -e "s/\(.*\)\r/'\1'/");
echo $sub1;
echo $sub2;
echo $sub3;
echo $sub4;
grep $sub4 modded_file.csv.dat;
done<input.csv

Die Ausgabe ist:

141
ps7
TILL WILL
'ps7.*,TILL WILL'
grep: WILL': No such file or directory

Aber wenn ich ausführe grep 'ps7.*,TILL WILL' modded_file.csv.dat, funktioniert es. Wie kann ich eine Variable wie oben gezeigt in einer Datei greppen?

Antwort1

Wie Sie aus Ihrer Eingabe ersehen können, haben Sie ein Leerzeichen in der Variable sub4. Schreiben Sie daher diese Zeile neu:

grep $sub4 modded_file.csv.dat;

zu sein

grep -- "$sub4" modded_file.csv.dat;

(Ergänzungen von @philippos) Und $sub4sollte keine einfachen Anführungszeichen enthalten ', da diese als Teil des Suchmusters betrachtet würden.

Ich denke, Ihr Missverständnis betrifft die Reihenfolge, in der Anführungszeichen und Erweiterung durchgeführt werden: Sie denken, zuerst werden Variablen erweitert und dann Anführungszeichen ausgeführt, sodass nach der Erweiterung die einfachen Anführungszeichen der Variablen die Zeichenfolge zitieren würden. Tatsächlich werden Anführungszeichen jedoch vor der Variablenerweiterung durchgeführt, sodass Sie die$sub

Antwort2

Das Ausführen grepinnerhalb einer Schleife ist ein massives Antimuster. Versuchen Sie stattdessen Folgendes.

awk -F "," 'NR==FNR { key[$1]=$2; value[$1]=$3; next }
    ($1 in key) && ($0 !~ "^" $1 ",.*," key[$1] "," value[$1] ",")' input.csv modded_file.csv.dat

Ich habe nicht versucht zu verstehen, warum Sie das \rdort irgendwie wollen oder erwarten, daher sind hier wahrscheinlich einige Anpassungen erforderlich.

Ein Awk-Skript besteht aus einer Folge von *condition- {Aktionspaaren }, die nacheinander auf jede Eingabezeile angewendet werden. Mit können Sie nextdas verbleibende Skript für diese Eingabezeile überspringen und zur nächsten Eingabe springen, und Sie können die{Aktion}Teil, wenn Sie einfach die gesamte Eingabezeile drucken möchten. (Sie können auch denZustand wenn Sie etwas bedingungslos tun möchten.) Jede Zeile wird in Felder aufgeteilt, die im Skript als $1, , usw. verfügbar sind. setzt das Feldtrennzeichen auf ein Komma (der Standardwert ist eine Folge von Leerzeichen).$2-F ","

Diese NR==FNRRedewendung ist eine gängige Methode, um zwei Eingabedateien in Awk zu verarbeiten. Die Gesamtzeilennummer NRentspricht der Zeilennummer in der Datei, FNRwenn Sie die erste Eingabedatei verarbeiten, und ist anschließend falsch.

Wenn wir die erste Datei lesen, speichern wir die Felder in zwei assoziativen Arrays, die beide durch das erste Feld als Schlüssel gekennzeichnet sind.

Wenn wir die zweite Datei lesen, drucken wir jede Eingabezeile, in der der Schlüssel im keyArray gefunden wird, und die gesamte Zeile entspricht nicht dem erwarteten regulären Ausdruck (das erste Feld ist der Schlüssel, gefolgt von irgendetwas, gefolgt von einem Komma, dem Spaltennamen, den wir in gespeichert haben key[$1], einem weiteren Komma, dem erwarteten Wert, den wir in gespeichert haben value[$1], und noch einem Komma).

Mit anderen Worten: Hiermit werden die Zeilen gefunden, in denen die erwartete Bedingung nicht erfüllt wurde. Entfernen Sie das , !wenn Sie stattdessen die Übereinstimmungen wünschen.

verwandte Informationen