Datei mit LIste vergleichen

L

locuststar

Grünschnabel
Hi zusammen

ich möchte eine Datei nach einer Menge von Strings durchsuchen (etwa 100) und bei einem Match die entsprechende Zeile nicht ausgeben.

Dachte ich mach das irgendwie mit awk und einem Array in dem die Strings drinstehen aber ich steh aufm Schlauch.

Weil ich das mit den arrays in awk bisher auch nicht blicke dachte ich, ich machs mal schnell so:

awk ' { e=system("grep $10 /tmp/Stringliste"); if ( e == 0 ) print $0 }' /tmp/Datei

Dabei kommt auch nur Müll raus.

Hat jemand einen Tip zur Vorgehensweise?

Danke und Gruß

Tom
 
Hallo
Grep bietet die Option -f<FILE mit Muster> an.
Das in Verbindung mit -v könnte doch dein Problem elegant und performant lösen.

Gruß Wolfgang
 
:D Kräh.....
Stimmt, tuts auch.

Und mir raucht der Kopf, dass man meint, man steht im Herbst an der Themse..... :think:

Thx.
 
Datei nach Strings durchsuchen, was ist falsch?

Hallo

ich kämpfe mit einem ähnlichen Problem. Ich möchte aber wissen, welche Strings der Liste in einer Datei nicht vorhanden sind. Grundsätzlich habe ich eine für mich zum Erfolg führende Lösung gefunden. Doch irgend etwas läuft ganz schräg... Das Resultat ist erst nach dem 5ten Durchgang richtig. Was ist falsch? Wie könnte man das Ding verbessern oder vereinfachen?

Hier mein Script (ich nummeriere mal):

1. grep -of liste.txt my.html | sort | uniq > tmp;
2. cat liste.txt >> tmp;
3. sort tmp | uniq -u > result;
4. grep -c .jpg result;
5. cat result > liste.txt;

Beschreibung:
1. Im File my.html nach allen Strings aus liste.txt suchen. Sortieren und 'uniq' - da sie mehrfach vorhanden sein können. Das Ganze zwischenspeichern.

2. Alle Strings aus liste.txt der Zwischenablage zufügen. -> Jetzt sind alle im File my.html vorhandenen Strings doppelt. Für die Anderen interessiere ich mich!

3. Zwischenablage sortieren und alle einmal vorkommenden Strings auslesen. Das sollte nun mein Resultat sein. Doch aus irgend einem Grund erhalte ich hier auch noch einige Strings, die im File my.html vorhanden sind. Aus diesem Grund 4. und 5.

4. Zählen der Strings (Jep es sind Bilder. Wer hats begriffen?)

5. sollte klar sein...

Danke für eure Hilfe
hansen
 
Hallo
Ich bin mir nicht sicher, ob ich dich verstanden habe.
Generell gilt einfach für grep:
1) -f file ->jede INPUT-Zeile (Datei oder STDIN) wird nach allen Strings in file durchsucht. Dabei muss file nicht sortiert sein.
2) Grep arbeitet Zeilenorientiert, was bei html eventuell zu Problemen führen kann.
3) mit -o werden nur die gesuchten Strings ausgegeben

Das was du da versuchst schaut mir etwas abenteuerlich aus.
Besonders Punkt 2 und 3.
Du verdoppelst es, um es anschließend wieder zu bereinigen.????
Eventuell poste doch mal ein paar Zeilen deiner beiden Dateien, und was du erwartest.


Gruß Wolfgang
 
Hallo Wolfgang

Danke für deine Antwort. Abenteuerlich :-) so bin ich auch vorgegangen. Ich hab einfach mal probiert, gelesen, probiert etc.

Aufgabestellung:
Das .html file ist in wirklichkeit ein TiddlyWiki, also JS. Darin werden dutzende Bilder vom Typ jpg referenziert. Ich möchte nun heraufinden, welche Bilder ich nicht referenziert (vergessen) habe.

1) 'sort' kann ich raus nehmen, da hast du recht.
2) Jep, sollte aber kein problem sein. html == txt
3) Mit -o werden wohl nur die gesuchten 'und gefundenen' Strings ausgegeben. so weiss ich schon mal, welche Bilder feferenziert werden. Aber noch nicht, welche nicht.
4) Ich verdopple, um anschliessend mit 'uniq' die nicht referenzierten Bilder zu ermitteln.

Unten hab ich Beispieldaten. Als resultat habe ich hier eine Auflistung: test1.jpg test2.jpg test3.jpg


Teil des .html files:
n/img_2048.jpg]] [[img_2050.jpg|bilder/cape_tribulation/img_2050.jpg]]\n\n!! Am Strand - die Ruhe...\n[img[bilder/cape_tribulation/img_2052.jpg]]\n[img[bilder/cape_tribulation/img_2056.jpg]]\n[img[bilder/cape_tribulation/img_2064.jpg]]\nweitere... [[img_2053.jpg|bilder/cape_tribulation/img_2053.jpg]] [[img_2054.jpg|bilder/cape_tribulation/img_2054.jpg]] [[img_2055.jpg|bilder/cape_tribulation/img_2055.jpg]] [[img_2057.jpg|bilder/cape_tribulation/img_2057.jpg]] [[img_2058.jpg|bilder/cape_tribulation/img_2058.jpg]] [[img_2061.jpg|bilder/cape_tribulation/img_2061.jpg]] [[img_2062.jpg|bilder/cape_tribulation/img_2062.jpg]] [[img_2063.jpg|bilder/cape_tribulation/img_2063.jpg]] [[img_2065.jpg|bilder/cape_tribulation/im

Suchliste:
test1.jpg
img_2048.jpg
img_2050.jpg
img_2050.jpg
img_2052.jpg
img_2053.jpg
img_2053.jpg
img_2054.jpg
img_2054.jpg
img_2055.jpg
img_2055.jpg
img_2057.jpg
img_2057.jpg
test2.jpg
img_2058.jpg
img_2058.jpg
img_2061.jpg
img_2061.jpg
img_2062.jpg
img_2062.jpg
img_2063.jpg
img_2063.jpg
img_2065.jpg
test3.jpg

Gruss, hansen
 
Hi,

also wenn Deine Eingangsdatei - wie offensichtlich Dein Beispiel - nicht zeilenorientiert ist, würde ich grep ganz weglassen und eher auf sed setzen.

Code:
cp htmlfile tmpfile; for picfile in `cat piclist`; do mv tmpfile srcfile; sed -e "s/\[[^[]*\[.*$picfile[^]]*\]\]//g" srcfile > tmpfile; done; rm srcfile; mv tmpfile resultfile

fallout@server/tmp> ls
piclist htmlfile

fallout@server:/tmp> cp htmlfile tmpfile; for picfile in `cat piclist`; do mv tmpfile srcfile; sed -e "s/\[[^[]*\[.*$picfile[^]]*\]\]//g" srcfile > tmpfile; done; rm srcfile; mv tmpfile resultfile

fallout@server:/tmp> cat resultfile
n/img_2048.jpg]] \n\n!! Am Strand - die Ruhe...\n\n [[img_2065.jpg|bilder/cape_tribulation/im

Das Script geht jeden Bildnamen aus picfile durch und schneidet diesen inklusive seiner Umgebung (anhand des regex \[[^[]*\[.*$bildname[^]]*\]\]) aus dem Text von htmlfile bzw. srcfile heraus und schreibt den Rest in tmpfile, welches für das nächste Bild dann wieder zum srcfile wird.
Ggf. gibt es auch noch eine elegantere Lösung für das Dateimanagement, aber das Ergebnis zählt ;-)

Edit: Man könnte es auch mit
Code:
fallout@server:/tmp> tmpstring=`cat htmlfile`; for picfile in `cat piclist`; do tmpstring=`echo $tmpstring|sed -e "s/\[[^[]*\[.*$picfile[^]]*\]\]//g"`; done; echo $tmpstring
versuchen, jedoch gibt es meines Wissens eine mir momentan nicht bekannte Größenbegrenzung von Variablen, wodurch ein großes htmlfile nicht in eine Variable zu packen ist.

Gruß Daniel
 
Zuletzt bearbeitet:

Ähnliche Themen

Ersetzen von Text mit Datei-Inhalt

Server-Monitoring mit RRDTool

Zurück
Oben