Két fájl összehasonlítása bash szkriptben?

Hogyan lehet két fájlt találni a shell parancsfájlban, és megismételni az adattárolót egy másik shell fájlban?

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

Írtam kódot, de nem működött. Hogyan kell megírni?

Megjegyzések

  • Megpróbálta használni diff parancs?

Válasz

Csak annak tesztelésére, hogy kettő van-e a fájlok megegyeznek, használja a cmp -s parancsot:

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

A -s zászló a cmp címre a segédprogramot “elnémítja”. A cmp kilépési állapota nulla lesz, ha összehasonlít két azonos fájlt. Ezt a fenti kódban használják arra, hogy kinyomtasson egy üzenetet arról, hogy a két fájl megegyezik-e vagy sem.


Ha a két bemeneti fájl fájlok útvonalneveinek listáját tartalmazza amelyet összehasonlítani szeretne, akkor használjon kettős hurkot, így:

  

Itt az eredmény mind a terminálon, mind pedig a file-comparison.out fájlban készül.

Feltételezzük, hogy a két bemeneti fájlban egyetlen útvonalnév sem tartalmaz beágyazott új sort.

A kód először az egyik fájl összes útvonalnevét egy tömbbe olvassa, files1, a mapfile használatával. Azért teszem ezt, hogy ne kelljen többször elolvasnom azt a fájlt, mivel a másik fájl minden egyes útnevéhez át kell mennünk mindazon útvonalneveken. Észre fogja venni, hogy ahelyett, hogy a belső hurokban lévő $filelist1 olvasmányt olvasnám, csak a files1 tömbben található neveket ismétlem. >

Megjegyzések

  • teljes programra van szükségem a bash shellben
  • @santhoshreddy Frissített válasz megtekintése.

Válasz

A legegyszerűbb módszer a diff parancs használatával.

példa:

tegyük fel, hogy az első fájl file1.txt és tartalmazza:

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

és a második fájlt 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. 

akkor a diff segítségével automatikusan megmutathatjuk számunkra, hogy mely sorok különböznek a két fájl között ezzel a paranccsal:

diff file1.txt file2.txt

és a kimenet a következő lesz:

 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. 

Nézzük meg, mit jelent ez a kimenet. Fontos megjegyezni, hogy amikor a diff leírja Önnek ezeket a különbségeket, akkor ezt előíró összefüggésben teszi: megmondja, hogyan kell megváltoztatni az első fájlt, hogy az megfeleljen a második fájlnak. A diff kimenet első sora a következőket tartalmazza:

  • az első fájlnak megfelelő sorszámok,
  • betű (a a hozzáadáshoz, c változtatáshoz vagy d törléshez) )
  • a második fájlnak megfelelő sorszámok.

A fenti kimenetünkben “2,4c2,4 “ jelentése:” Sorok 2 4 az első fájlban meg kell változtatni, hogy megfeleljenek a 2 4 között a második fájlban. ” Ezután megmondja, hogy ezek a sorok miként vannak az egyes fájlokban:

  • A < előtti sorok az első fájl sorai;
  • sorok, amelyeket megelőz>, a második fájl sorai.

  • A három kötőjel (“—“) csupán elválasztja az 1. és a 2. fájl sorait.

Forrás

Válasz

Itt van egy tiszta bash shell szkript a fájlok összehasonlításához:

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

termel:

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

A adott parancsok eltávolíthatók az első látott különbségnél való kilépéshez, és ha minden olvasott sort meg akar látni.

Lásd az http://www.linuxjournal.com/content/reading-multiple-files-bash a fájlleírókkal kapcsolatos részletekért, mint például a “& 3”.

Üdvözlettel … ujjongás, drl

megjegyzések

  • head egy külső segédprogram, és mi a $HOME/bin/context? És mit jelentenek a megjegyzések a tetején?
  • A Head megjeleníti a bevitelt. Nem játszik külön a differenciálásban. Csakúgy, mint néhány más elemnél, az ” context ” helyi, hogy megmutassa a környezeti kontextust. Ennek belefoglalásával nem kell megvitatnunk, hogy az operációs rendszerek és a használhatóságok verziói különböznek-e.
  • Hiányzott egy exportálás, köszönjük, hogy észrevette.

li>

  • Még mindig nem értem ‘ a megjegyzést.Mi ‘ s egy ” külső felhasználó “, és miért szeretné beállítani a tiszta szkript elérési útja bash?
  • Kódot írunk üzletünkhöz, így az útvonal-beállítások eltérőek lehetnek a külső felhasználók számára. Hozzátesszük, hogy ha szükségesnek tűnik a beállítások elhagyása. Ez egy sablon, amelyet úgy módosítottak, hogy megjelenítse az információt arról a környezetről, amelyben a kódot végrehajtották. Ha azt termelési kódokká alakítanák át, mondjuk az ügyfelek számára, a bemutató kód helyett ‘ szeretnénk biztosak lenni abban, hogy egyetlen helyi útvonalat sem használunk. mert a kontextus úgy lett megtervezve, hogy ha nem találja meg a fájlt, akkor semmi sem fog történni, még hiba sem, de egyetlen verzió sem jelenik meg.
  • Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük