Come faccio a confrontare due file con uno script di shell?


10

Dato due file, voglio scrivere uno script shell che legge ogni riga da file1 e controlla se è presente in file2. Se non viene trovata una riga, dovrebbero essere emessi due file diversi che devono uscire. I file possono contenere numeri di parole o altro. Per esempio :

file1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

In questo caso due file dovrebbero essere uguali. se file2 ha "ciao !!!" invece di "ciao", i file sono diversi. Sto usando lo script bash. Come posso fare questo. Non è importante che io debba farlo in un ciclo nidificato, ma è quello che pensavo fosse l'unico modo. Grazie per l'aiuto.

Risposte:



10

diffimposta il suo stato di uscita per indicare se i file sono uguali o meno. Lo stato di uscita è accessibile nella variabile speciale $?. Puoi espandere la risposta di Ignacio in questo modo:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
Puoi semplicemente fare a if diff ... >/dev/nullmeno delle parentesi e delle variabili.
In pausa fino a ulteriore avviso.

1

Aggiungendo questo perché penso che [[]] && || il costrutto è piuttosto pulito:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

Dovrebbe funzionare anche:

comm -3 file1 file2

Penso che questo sia abbastanza personaggi per una risposta ...


1

Sebbene diffsia una risposta perfettamente valida, probabilmente userò cmpinvece che è specificamente per fare un confronto byte per byte di due file.

https://linux.die.net/man/1/cmp

Per questo motivo, ha l'ulteriore vantaggio di poter confrontare i file binari.

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

Sono portato a credere che sia più veloce dell'uso, diffanche se non l'ho testato personalmente.


Il caso "I file sono diversi" non andrebbe per primo? Il test if chiede se qualcosa è vero, cioè un codice di ritorno diverso da zero. Se i file corrispondono, cmp restituisce 0 (per la manpage), quindi dovrebbe essere il secondo caso.
user8162

@ user8162 Quello che dici ha senso, tuttavia l'ho appena testato e questo è il modo giusto. Non sono sicuro del perché sia ​​così per essere onesti.
Richard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.