Twee bestanden vergelijking in bash-script?

Hoe vind ik twee overeenkomende bestanden in het shellscript en een duplicaat van de gegevensopslag in een ander bestand in de shell?

#!/bin/bash file1="/home/vekomy/santhosh/bigfiles.txt" file2="/home/vekomy/santhosh/bigfile2.txt" while read -r $file1; do while read -r $file2 ;do if [$file1==$file2] ; then echo "two files are same" else echo "two files content different" fi done done 

Ik heb code geschreven maar het werkte niet. Hoe het te schrijven?

Reacties

  • Heb je geprobeerd om diff commando?

Antwoord

Om gewoon te testen of twee bestanden zijn hetzelfde, gebruik cmp -s:

#!/bin/bash file1="/home/vekomy/santhosh/bigfiles.txt" file2="/home/vekomy/santhosh/bigfile2.txt" if cmp -s "$file1" "$file2"; then printf "The file "%s" is the same as "%s"\n" "$file1" "$file2" else printf "The file "%s" is different from "%s"\n" "$file1" "$file2" fi 

De -s markeren naar cmp zal het hulpprogramma “stil” maken. De exitstatus van cmp zal nul zijn bij het vergelijken van twee identieke bestanden. Dit wordt in de bovenstaande code gebruikt om een bericht af te drukken of de twee bestanden identiek zijn of niet.


Als uw twee invoerbestanden een lijst met padnamen van bestanden bevatten die je wilt vergelijken, gebruik dan een dubbele lus, zoals:

  

Hier wordt het resultaat geproduceerd op zowel de terminal als in het bestand file-comparison.out.

Aangenomen wordt dat geen padnaam in de twee invoerbestanden ingesloten nieuwe regels bevat.

De code leest eerst alle padnamen van een van de bestanden in een array, files1, met mapfile. Ik doe dit om te voorkomen dat ik dat bestand meer dan eens moet lezen, omdat we al die padnamen voor elke padnaam in het andere bestand moeten doorlopen. U zult zien dat in plaats van te lezen uit $filelist1 in de binnenste lus, ik gewoon de namen in de files1 array herhaal.

Reacties

  • ik heb totaal programma nodig in bash shell
  • @santhoshreddy Zie bijgewerkt antwoord.

Answer

De gemakkelijkste manier is om het commando diff te gebruiken.

voorbeeld:

laten we aannemen dat het eerste bestand file1.txt en hij bevat:

I need to buy apples. I need to run the laundry. I need to wash the dog. I need to get the car detailed.` 

en het tweede bestand file2.txt

I need to buy apples. I need to do the laundry. I need to wash the car. I need to get the dog detailed. 

dan kunnen we diff gebruiken om automatisch voor ons weer te geven welke regels verschillen tussen de twee bestanden met dit commando:

diff file1.txt file2.txt

en de uitvoer zal zijn:

 2,4c2,4 < I need to run the laundry. < I need to wash the dog. < I need to get the car detailed. --- > I need to do the laundry > I need to wash the car. > I need to get the dog detailed. 

Laten we eens kijken wat deze uitvoer betekent. Het belangrijkste om te onthouden is dat wanneer diff deze verschillen aan jou beschrijft, het dit in een prescriptieve context doet: het vertelt je hoe je het eerste bestand kunt wijzigen om het overeen te laten komen met het tweede bestand. De eerste regel van de diff-uitvoer bevat:

  • regelnummers die overeenkomen met het eerste bestand,
  • een letter (a voor toevoegen, c voor wijzigen of d voor verwijderen )
  • regelnummers die overeenkomen met het tweede bestand.

In onze uitvoer hierboven, “2,4c2,4 “ betekent:” Regels 2 tot en met 4 in het eerste bestand moeten worden gewijzigd om overeen te komen met regels 2 tot en met 4 in het tweede bestand. ” Vervolgens vertelt het ons wat die regels in elk bestand zijn:

  • Regels voorafgegaan door een < zijn regels uit het eerste bestand;
  • regels voorafgegaan door> zijn regels uit het tweede bestand.
  • De drie streepjes (“—“) scheiden slechts de regels van bestand 1 en bestand 2.

Bron

Antwoord

Hier is een pure bash shell-script om bestanden te vergelijken:

#!/usr/bin/env bash # @(#) s1 Demonstrate rudimentary diff using shell only. # Infrastructure details, environment, debug commands for forum posts. # Uncomment export command to run as external user: not context, pass-fail. # export PATH="/usr/local/bin:/usr/bin:/bin" set +o nounset LC_ALL=C ; LANG=C ; export LC_ALL LANG pe() { for _i;do printf "%s" "$_i";done; printf "\n"; } pl() { pe;pe "-----" ;pe "$*"; } db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; } db() { : ; } C=$HOME/bin/context && [ -f "$C" ] && $C set -o nounset FILE1=${1-data1} shift FILE2=${1-data2} # Display samples of data files. pl " Data files:" head "$FILE1" "$FILE2" # Set file descriptors. exec 3<"$FILE1" exec 4<"$FILE2" # Code based on: # http://www.linuxjournal.com/content/reading-multiple-files-bash # Section 2, solution. pl " Results:" eof1=0 eof2=0 count1=0 count2=0 while [[ $eof1 -eq 0 || $eof2 -eq 0 ]] do if read a <&3; then let count1++ # printf "%s, line %d: %s\n" $FILE1 $count1 "$a" else eof1=1 fi if read b <&4; then let count2++ # printf "%s, line %d: %s\n" $FILE2 $count2 "$b" else eof2=1 fi if [ "$a" != "$b" ] then echo " File $FILE1 and $FILE2 differ at lines $count1, $count2:" pe "$a" pe "$b" # exit 1 fi done exit 0 

produceren:

$ ./s1 Environment: LC_ALL = C, LANG = C (Versions displayed with local utility "version") OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64 Distribution : Debian 8.9 (jessie) bash GNU bash 4.3.30 ----- Data files: ==> data1 <== I need to buy apples. I need to run the laundry. I need to wash the dog. I need to get the car detailed. ==> data2 <== I need to buy apples. I need to do the laundry. I need to wash the car. I need to get the dog detailed. ----- Results: File data1 and data2 differ at lines 2, 2: I need to run the laundry. I need to do the laundry. File data1 and data2 differ at lines 3, 3: I need to wash the dog. I need to wash the car. File data1 and data2 differ at lines 4, 4: I need to get the car detailed. I need to get the dog detailed. 

De opmerkingen over specifieke commandos kunnen worden verwijderd om af te sluiten bij het eerste verschil dat wordt gezien, en als je elke regel wilt zien die wordt gelezen.

Zie pagina op http://www.linuxjournal.com/content/reading-multiple-files-bash voor details over bestandsbeschrijvingen zoals “& 3”.

Beste wensen … proost, drl

Reacties

  • head is een extern hulpprogramma, en wat is $HOME/bin/context? En wat betekenen de opmerkingen bovenaan?
  • Head toont de invoer. Het speelt niet apart in de verschillen. Net als bij sommige andere items is ” context ” lokaal om de omgevingscontext te tonen. Door dat op te nemen, hoeven we ‘ niet te bespreken of versies van besturingssystemen en hulpprogrammas verschillen.
  • Er ontbrak een export, bedankt voor het opmerken.
  • Ik begrijp de opmerking nog steeds niet ‘.Wat is ‘ een ” externe gebruiker “, en waarom zou je de pad voor een script dat puur is bash?
  • We schrijven code voor onze winkel, dus de padinstellingen kunnen verschillen voor externe gebruikers. We voegen dat toe als het nodig lijkt om onze instellingen weg te laten. Dit is een sjabloon dat is aangepast om de informatie weer te geven over de omgeving waarin de code is uitgevoerd. Als het zou worden omgezet in een productiecode, bijvoorbeeld voor klanten, in plaats van een demo-code, zouden we ‘ er zeker van willen zijn dat geen van onze lokale paden wordt gebruikt. for context is zo ontworpen dat als dat bestand niet wordt gevonden, er niets gebeurt, zelfs geen fout, maar er worden geen versies weergegeven.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *