To filer sammenligning i bash script? (Norsk)

Hvordan finner du to filer som samsvarer med data i skallskript og dupliserte datalagring i en annen fil i skall?

#!/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 

Jeg skrev kode, men den fungerte ikke. Hvordan skriver jeg den?

Kommentarer

  • Har du prøvd å bruke diff kommando?

Svar

For å bare teste om to filene er de samme, bruk 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 

-s flagg til cmp vil gjøre verktøyet «stille». Utgangsstatusen for cmp vil være null når du sammenligner to identiske filer. Dette brukes i koden ovenfor for å skrive ut en melding om de to filene er identiske eller ikke.


Hvis de to inndatafilene dine inneholder en liste over banenavn av filer som du ønsker å sammenligne, bruk deretter en dobbel sløyfe slik:

  

Her produseres resultatet både på terminalen og i filen file-comparison.out.

Det antas at ingen banenavn i de to inndatafilene inneholder noen innebygde nye linjer.

Koden leser først alle banenavn fra en av filene til en matrise, files1, ved hjelp av mapfile. Jeg gjør dette for å unngå å måtte lese den filen mer enn en gang, ettersom vi blir nødt til å gå gjennom alle stienavnene for hvert stinavn i den andre filen. Du vil merke at i stedet for å lese fra $filelist1 i den indre sløyfen, gjentar jeg bare navnene i files1 -arrayen.

Kommentarer

  • jeg trenger totalt program i bash shell
  • @santhoshreddy Se oppdatert svar.

Svar

Den enkleste måten er å bruke kommandoen diff.

eksempel:

la oss anta at den første filen er file1.txt og han inneholder:

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

og den andre filen 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. 

så kan vi bruke diff til å automatisk vise for oss hvilke linjer som er forskjellige mellom de to filene med denne kommandoen:

diff file1.txt file2.txt

og utgangen vil være:

 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. 

La oss ta en titt på hva denne utgangen betyr. Det viktige å huske er at når diff beskriver disse forskjellene for deg, gjør det det i en reseptbelagt sammenheng: det forteller deg hvordan du endrer den første filen slik at den samsvarer med den andre filen. Den første linjen i diff-utgangen vil inneholde:

  • linjenumre som tilsvarer den første filen,
  • en bokstav (a for add, c for endring eller d for sletting )
  • linjenumre som tilsvarer den andre filen.

I vår utgang ovenfor, «2,4c2,4 « betyr:» Linjer 2 til 4 i den første filen må endres for å matche linjene 2 til 4 i den andre filen. » Den forteller oss deretter hva disse linjene er i hver fil:

  • Linjer foran en < er linjer fra den første filen;
  • linjer foran> er linjer fra den andre filen.
  • De tre bindestrekene («—«) skiller bare linjene i fil 1 og fil 2.

Kilde

Svar

Her er et rent bash skallskript for å sammenligne filer:

#!/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 

produserer:

$ ./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. 

Kommentarene til spesifikke kommandoer kan fjernes for å avslutte ved den første forskjellen sett, og hvis du ønsker å se hver linje som blir lest.

Se side på http://www.linuxjournal.com/content/reading-multiple-files-bash for detaljer om filbeskrivelser som «& 3».

Beste ønsker … skål, drl

Kommentarer

  • head er et eksternt verktøy, og hva er $HOME/bin/context? Og hva betyr kommentarene øverst?
  • Head viser inndataene. Det spiller ikke hverandre i forskjellen. Som med noen andre elementer er » kontekst » lokal for å vise miljøkonteksten. Ved å inkludere det trenger vi ikke ‘ å diskutere om versjoner av operativsystemer og bruksområder er forskjellige.
  • Det manglet en eksport, takk for at du la merke til det.
  • Jeg forstår fortsatt ikke ‘ t forstå kommentaren.Hva ‘ er en » ekstern bruker «, og hvorfor vil du angi sti for et skript som er rent bash?
  • Vi skriver kode for butikken vår, så stiinnstillingene kan variere for eksterne brukere. Vi legger til at hvis det synes nødvendig å utelate innstillingene våre. Dette er en mal som er modifisert for å vise informasjonen om miljøet koden ble kjørt i. Hvis den ville blitt transformert til en produksjonskode, si for klienter, i stedet for en demokode, vil vi ‘ d være sikre på at ingen av våre lokale baner blir brukt. for kontekst er utformet slik at hvis filen ikke blir funnet, vil ingenting skje, ikke engang en feil, men ingen versjoner vil bli oppført.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *