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
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;
- A három kötőjel (“—“) csupán elválasztja az 1. és a 2. fájl sorait.
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>
bash
?
diff
parancs?