2016-06-09 7 views
1

Ich versuche ein kleines Unix-Skript zu schreiben, um eine Datei nach der Zeile zu suchen, die einen bestimmten Begriff in einer anderen Datei enthält. Ich möchte die Ausgabe dieses Befehls in eine neue Datei speichern.Unix: Führen Sie den Befehl grep für jede Zeile aus der Eingabedatei aus und speichern Sie die Ausgabe in Datei

Ich habe eine Datei Begriffe (terms.txt) enthält, die in jeder Zeile einen Begriff hat:

term1 
term2 
term3 
term4 

Für jede dieser Hinsicht möchte ich die Linie finden, die diesen Begriff in einer anderen Datei enthält (scores.txt) und hängt die Ausgabe an eine neue Datei (output.txt) an.

Das Skript, das ich mit so weit gekommen sind:

#!/bin/bash 
for f in `cat terms.txt`; 
do 
grep -i $f scores.txt >> output.txt; 
done 

Irgendwie nicht richtig zu funktionieren scheint. Lauf nur der Befehl grep mit dem Begriff hart codiert gibt mir in der Tat die richtige Linie ich suche:

grep -i "term1" scores.txt 

Auch ein einfaches Echo gibt mir die richtigen Bedingungen:

for f in `cat terms.txt`; do echo $f; done 

Wenn ich jedoch versuche, dies mit der Variablen $ f zu wiederholen, um den gleichen Befehl für jeden Ausdruck in meiner terms.txt zu wiederholen, funktioniert es nicht.

Könnte mir jemand dabei helfen?

+1

Suchen Sie in der Grep-Manpage nach der Option '-f'. Sie brauchen überhaupt keine Schleife. – 123

+0

@Bouke: Überprüfen Sie die Antwort unten! – Inian

Antwort

3

können Sie versuchen:

grep -if terms.txt scores.txt > output.txt 

grundsätzlich grep ‚s Option f behandelt die Zeichenfolgen in der terms.txt Datei als Muster für die Suche in scores.txt

Wenn Ihr terms.txt CRLF Zeilenenden hat, versuchen Sie dies:

grep -if <(tr -d '\r' < terms.txt) scores.txt > output.txt 
+0

Dies ist genau das, was ich versucht habe, aber es gibt mir auch keine Ausgabe. Selbst ein einfacher "grep -if terms.txt scores.txt" gibt mir keine Ausgabe. – Bouke

+0

Edit: Vielleicht verwirrt das Layout meiner terms.txt und scores.txt die Dinge ein bisschen? Nur eine schnelle Paste, damit Sie besser verstehen, was ich versuche zu tun: terms.txt: http://pastebin.com/yxJL1cQE, scores.txt: http://pastebin.com/bw46Utpk Basicly, Ich versuche den Sentiment-Score zu finden, der in scores.txt für jeden ANP gefunden wurde, der sich in terms.txt befindet. – Bouke

+0

Was gibt 'file terms.txt' zurück? Sagt es irgendetwas über CRLF-Leitungsabschlusswiderstände? – anishsane

Verwandte Themen