Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

OS Linux

Twee tekstbestanden vergelijken

awinkel
16 antwoorden
  • Ik wil de inhoud van twee tekstbestanden vergelijken en het verschil tussen beide bestanden in een apart tekstbestand weg laten schrijven.
    Ik heb al wat met "diff" geprobeerd maar het lukt mij niet om alleen het verschil weg te laten schrijven.
    Ik heb al "diff file1 file 2 > newfile.txt" geprobeerd, maar dan krijg ik een bestand vol met > en < voor de regels.
    Weet iemand de juiste syntax?
  • Misschien moet je eens naar het programma patch kijken. Dat is in feite he verwerken van verschilbestanden (gemaakt met diff?)
  • Misschien een stom antwoord, maaruh… Terminal openen -> man diff ??

    Misschien uitleg voor < en > ?

    < = staat wel in file1, niet in file2;
    > = vice versa?

    Greetz!
  • Man diff heb ik geprobeerd maar volgens de output op de console was er geen manpage aanwezig voor diff. :S
    Ik zal morgen op me werk eens aan de gang gaan met patch.
  • man diff bestaat bij mij wel degelijk…… misschien zit jij met info pages van diff?
  • Maak eens 2 gelijke bestanden aan, en wijzig in beide 1 regel.
    Maak hier vervolgens een diff van, en kijk hoe die gewijzigde regels door diff worden behandeld.
    Weet je meteen hoe de syntaxis van diff werkt.
    Grafisch kan ook, met Kompare van KDE.

    Rinse
  • de < in de diff output betekent inderdaad dat die regel alleen in de eerste file staat, en de > dat die regel alleen in de tweede staat. Boven z'n groepje regels staat ook steeds om hoeveel regels het gaat (bijv [b:6a7800a3e8]2c3[/b:6a7800a3e8]).

    Als beide bestanden gesorteerde lijsten zijn, kun je ook met comm gaan prutsen; zie man comm.
  • Ik heb het één en ander geprobeerd en snap nu hoe de syntax werkt.
    Helaas werkt het nog niet helemaal voor de situatie waarvoor ik het wil gebruiken.
    Ik heb twee lijsten met ongeveer 1000 getallen van 5 cijfers.
    Beide lijsten zijn verschillend, lijst 2 is een update van lijst 1.
    Nu wil ik in een apart bestand (lijst 3 dus) alleen de nieuwe getallen van lijst 2 hebben die dus niet in lijst 1 staan.
    Alleen…als een getal in lijst 2 op een andere plek staat dan in lijst 1 wordt dat ook als een verandering gezien door diff en komt dat getal in lijst 3 ook te staan, dit moet dus niet.
    Weet iemand hier een oplossing voor?
  • Misschien dat comm(1) uitkomst kan bieden.

    file1 bevat 1 2 4 5 7 8 9
    file2 bevat 1 2 3 4 5 6 7 8 9

    De getallen staan allemaal op een nieuwe regel.

    Ik krijg een redelijk resultaat met het volgende commando:
    [code:1:8125f7a99e]
    $ comm -3 file1 file2 | cut -f 2
    3
    6
    [/code:1:8125f7a99e]

    Comm genereert een tabel waarvan je de inhoud wel kunt manipuleren, maar niet de layout. Met cut krijg je bruikbare output.
  • Dit ziet er veelbelovend uit!
    Ik ga het maandag als ik weer op me werk ben er eens mee aan de slag.
    Ik laat nog weten of het gelukt is.
  • je zou beide files "on the fly" kunnen sorteren en dan als input aan comm voeren. Bash heeft hiervoor heel krachtige mogelijkheden:
    [code:1:77a3cd3466]
    comm -3 <(sort file1) <(sort file2) | cut -f 2 > file3
    [/code:1:77a3cd3466]
    De [i:77a3cd3466]<(commando)[/i:77a3cd3466] constructie in bash creeert een proces waarvan de output gelezen wordt door comm alsof het een gewone file is.
    Experimenteer maar eens met:
    [code:1:77a3cd3466]
    $ echo <(echo hoi)
    /dev/fd/63
    $ cat <(echo hoi)
    hoi
    [/code:1:77a3cd3466]
  • Ik heb het net getest op me werk en het werkt fantastisch!
    Vooral dat sorteren erbij is een leuk bijkomend pluspunt.
    Allemaal hartelijk bedankt voor het meedenken!
  • Hmm…iets te vroeg gejuigd :(
    Ze hebben op me werk besloten de lijsten aan te passen zodat de inhoud van lijst 1 niet meer terug komt in lijst 2.
    Stel dat ik de volgende tekstbestanden heb:

    [b:eb548f640a]lijst1 – lijst2[/b:eb548f640a]
    1 —— 1
    2 —— 3
    3 —— 5
    4 —— 6


    Dan moet er in een nieuw bestand (lijst 3)de volgende inhoud verschijnen:

    5
    6

    Dit krijg ik na veel proberen niet voor elkaar met comm.
    Ik heb ook al comm 2 geprobeerd, maar dit levert niet het juiste resultaat op…
  • staan de lijsten op volgorde? zo niet dan moet je ze nog even met sort behandelen.
    [code:1:fb71e9a919]diff -d list1 list2 | grep ">" > output[/code:1:fb71e9a919]
    levert je vervolgens een lijstje met alle getallen die wel in 2 maar niet in 1 staan (mits de lijsten op volgorde staan!) Er staat nu alleen nog een "> " voor, maar die kun je met sed makkelijk wegwerken
    [code:1:fb71e9a919]sed 's/>\ //' output > final_output[/code:1:fb71e9a919]
  • Bedankt, het werkt nu echt helemaal!
  • de grep en de sed in het vorige comment kunnen nog worden gecombineerd tot 1 sed commando:[code:1:313b3a8cb0]grep '>' | sed 's/^> //' > output_file[/code:1:313b3a8cb0]kan ook worden geschreven als:[code:1:313b3a8cb0]sed -ne 's/^> //p' > output_file[/code:1:313b3a8cb0]wat weer een procesje scheelt :-)
    Een p direct achter een s commando print alleen als de substitutie lukte. De -n optie zorgt ervoor dat sed default niet print. Vandaar :-)

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.