Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

bash script dat in txt bestand zoekt het gevonden verwijderd

Pagina: 1
Acties:

  • Freez
  • Registratie: November 2000
  • Laatst online: 11-11 09:57
Hoi,

Ik ben bezig om een script te maken dat 1 tekstbestand regel voor regel doorloopt en vervolgens kijkt in een ander tekstbestand of de regel uit bestand 1 voorkomt in een regel uit bestand 2. Daarna wil ik dat als de string uit bestand 1 voorkomt in bestand 2 dit niet schrijft naar bestand 3. Maar alleen naar bestand 3 schrijft als de string uit bestand 1 niet voorkomt in bestand 2.

Concreet: ik heb 2 bestanden, in het 1e bestand staan domeinen, in het 2e bestand staan URL's.
Zodra een domein uit bestand 1 voorkomt in een URL uit bestand 2, dan wil ik graag dat de regel wordt verwijderd uit bestand 2 (of eventueel dat bestand 3 de URL's bevat waarvan de domeinen niet voorkomen in het domein bestand).

Nu heb ik zelf wat basiskennis over bash programmeren onder Linux, maar hier kom ik niet zo goed uit.

Wat ik tot nu toe heb is het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
for line in `cat domain.txt`
        do
        new=`grep -i $line url.txt`
        exitcode=$?
        if [ $exitcode = 0 ]; then
                echo "domein komt niet voor in url lijst, schrijf naar 2e file"
                echo $new >> url2.txt
        else
                echo "$line : domein bestaat in url lijst, volgende regel"
        fi
done


Alleen dit doet precies het tegenovergestelde wat ik eigenlijk wil bereiken.

Ik heb nog wel wat andere stukjes code gevonden met sed en awk, alleen dat werkt over het gehele tekstbestand ipv per regel:
code:
1
2
3
4
for domline in `cat domain.txt`
        do
        sed -e '/$domline/d' url.txt >url2.txt
done


Ik weet dat ik ergens dingen moet gaan combineren alleen ik loop vast met hoe ik nu goed awk en sed kan gebruiken bij mijn eerste code zodat ik het goede bereik.

Ik hoop dat het duidelijk genoeg ik wat ik wil bereiken :)

Verwijderd

cat domains.txt | while read DN; do sed -i -e "/$DN/d" urls.txt; done

  • Freez
  • Registratie: November 2000
  • Laatst online: 11-11 09:57
Hmmm, dat is eigenlijk precies wat ik nodig heb, geweldig, bedankt :) _/-\o_

Is er met deze manier ook nog een limiet van bestandsgrootte?
Het domein bestand is namelijk bijna 8 MB en het URL bestand zo'n 6 MB.

Verwijderd

Alleen als je heel lange domeinnamen hebt zou je ongein kunnen verwachten.

De "while read" kent geen beperkingen, die leest gewoon regel voor regel, en omdat sed een "stream editor" is, maakt het voor sed niet zoveel uit hoe lang een file is. Dus eigenlijk hoef je geen rare dingen te verwachten, tenzij je domeinen gaan conflicteren doordat de "." als elk willekeurig teken kan worden gezien.

Denk aan "bla.co.uk" versus "blanco.uk", maar eigenlijk zou ik daar niet vanuitgaan.

[ Voor 23% gewijzigd door Verwijderd op 05-11-2008 23:24 ]


  • jschot
  • Registratie: Oktober 2002
  • Laatst online: 09-07 09:46
code:
1
grep -v -F -f domains.txt urls.txt