2016-05-28 7 views
0

Lange Rede kurzer Sinn, ich versuche, einen Wert in der ersten Spalte einer Textdatei grep unter Verwendung einer Variablen.Erstellen Sie Variable durch die Kombination von Text + eine andere Variable

Hier ist eine Probe des Skripts mit dem Befehl grep, das nicht funktioniert:

for ii in `cat list.txt` 
do 
    grep '^$ii' >outfile.txt 
done 

Inhalt von list.txt:

123,"first product",description,20.456789 
456,"second product",description,30.123456 
789,"third product",description,40.123456 

Wenn ich grep '^123' list.txt ausführen, erzeugt es die richtige Ausgabe ... Nur die erste Zeile von list.txt.

Wenn ich versuche, die Variable (dh grep '^ii' list.txt) zu verwenden, bekomme ich einen Fehler "^ ii Befehl nicht gefunden". Ich habe versucht, Text mit den Variablen zu kombinieren, um es der Arbeit zu:

VAR1= "'^"$ii"'" 

aber die VAR1 Variable einen Wagenrücklauf nach den $ii Variablen enthalten:

'^123 
' 

ich eine kurzen Liste der Dinge ausprobiert habe um das cr/lr (dh sed & awk) zu entfernen, aber ohne Erfolg. Es muss eine einfachere Möglichkeit geben, den Befehl grep mit der Variablen auszuführen. Ich würde lieber mit dem Befehl grep bleiben, weil es perfekt funktioniert, wenn es manuell ausgeführt wird.

+1

Bitte werfen Sie einen Blick auf [Bearbeitungshilfe] (http://stackoverflow.com/editing-help). – Cyrus

+3

Zeigen Sie auch Ihre gewünschte Ausgabe. – John1024

+0

Danke für die Antworten! Die gewünschte Ausgabe ist in diesem Fall nur die erste Zeile der Datei. Grundsätzlich möchte ich, dass Grep die erste Spalte durchsucht und den Rest der Spalten ignoriert. Wenn ein Grep ohne Flags verwendet wird, wird jede Zeile der Datei angezeigt. –

Antwort

1

Sie haben Dinge in den Befehl gemischt grep '^ii' list.txt. Das Zeichen ^ steht für den Anfang der Zeile und $ steht für den Wert einer Variablen. Wenn Sie wollen für 123 in der Variable ii am Anfang der Zeile grep verwenden

ii="123" 
grep "^$ii" list.txt 

(Sie sollen hier doppelte Anführungszeichen verwenden)
guten Moment für gute Gewohnheiten zu lernen: in Klein in Variablennamen Weiter (gut gemacht) und verwenden Sie geschweifte Klammern (nicht schaden und in anderen Fällen erforderlich):

ii="123" 
grep "^${ii}" list.txt 

Jetzt haben wir beide etwas zu vergessen: Unsere grep auch 1234,"4-digit product",description,11.1111 entsprechen. Fügen Sie ein , im grep:

ii="123" 
grep "^${ii}," list.txt 

Und wie haben Sie den „^ ii Befehl nicht gefunden“ Fehler erhalten? Ich denke, man verwendet einfachen Anführungszeichen (alte Art und Weise einen Befehl zum Nisten, besser ist echo "example: $(date)") und man schrieb

grep `^ii` list.txt # wrong ! 
+0

Danke Walter, das hat den Trick gemacht! Zusätzlich zu Ihrer Antwort habe ich festgestellt, dass ich eine dos2unix-Datei in der Datei list.txt ausführen musste, da sie in Windows generiert wurde. Danke an alle, die geantwortet haben !!! –

0
#!/bin/sh 
# Read every character before the first comma into the variable ii. 
while IFS=, read ii rest; do 
    # Echo the value of ii. If these values are what you want, you're done; no 
    # need for grep. 
    echo "ii = $ii" 
    # If you want to find something associated with these values in another 
    # file, however, you can grep the file for the values. Use double quotes so 
    # that the value of $ii is substituted in the argument to grep. 
    grep "^$ii" some_other_file.txt >outfile.txt 
done <list.txt