it-swarm.com.de

Verwenden Sie eine Liste von Wörtern, um eine andere Liste einzublenden

Ich habe eine Liste mit 250 Zeilen. Ich muss sie alle über einen Webserver ausführen, um eine Liste der Ausgaben zu erhalten. Diese Liste gibt jedoch viel mehr Zeilen zurück, als ich interessiert bin. Sagen wir, mein list.txt ist:

a.1
b.1
etc

dann ist die Ausgabe output.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Ist es möglich, mit dem Befehl grep nach allen Wörtern in der Datei list.txt in der Datei output.txt zu suchen und dann "die gewünschte" Liste wanted.txt zu generieren? Ich brauche die gesamte Zeile in meiner output.txt. Ich bin neu in der Skripterstellung, aber ich möchte so etwas wie

grep list.txt output.txt > wanted.txt

Ich habe keine Beispiele dafür finden können

8
Ditte

Ich würde grep für diesen ignorieren. Es ist gut für reguläre Ausdrücke, aber es sieht nicht so aus, als ob Sie das hier wirklich brauchen. comm kann zwei Dateien vergleichen und Ihnen Schnittpunkte anzeigen. Anhand Ihrer genauen Beispiele:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

Dies ist schneller als jedes Grep, hängt jedoch (stark) von den zu sortierenden Dateien ab. Wenn dies nicht der Fall ist, können Sie sie vorsortieren. Dadurch wird die Ausgabe jedoch so geändert, dass sie auch sortiert wird.

comm -12 <(sort list.txt) <(sort output.txt) 

Alternativ können Sie diese Antwort von iiSeymour mit grep ausführen. Die Flags fordern eine Eingabedatei an und erzwingen eine Vollwortsuche mit festen Zeichenfolgen. Dies hängt nicht von der Bestellung ab, sondern von der output.txt Bestellung. Kehren Sie die Dateien um, wenn Sie möchten, dass sie in der Reihenfolge der list.txt angezeigt werden.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

Wenn Ihr list.txt wirklich groß ist, müssen Sie dies möglicherweise etwas iterativer angehen und jede Zeile einzeln an grep übergeben. Dies wird die Verarbeitungszeit massiv verlängern. Oben würden Sie output.txt einmal lesen, aber auf diese Weise würden Sie es für jede list.txt-Zeile lesen und verarbeiten. Es ist schrecklich ... Aber es könnte Ihre einzige Wahl sein. Auf der Oberseite sortiert es dann Sachen durch die list.txt Ordnung.

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc
11
Oli