Confronto di due file nello script bash?

Come trovare due file corrispondenti a dati nello script della shell e duplicare larchivio dati in un altro file nella 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 

Ho scritto del codice ma non ha funzionato. Come scriverlo?

Commenti

  • Hai provato a usare diff comando?

Risposta

Per verificare se due i file sono gli stessi, utilizza 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 

Il -s il flag a cmp renderà lutilità “silenziosa”. Lo stato di uscita di cmp sarà zero quando si confrontano due file identici. Viene usato nel codice sopra per stampare un messaggio che indica se i due file sono identici o meno.


Se i tuoi due file di input contengono un elenco di percorsi di file che desideri confrontare, quindi utilizza un doppio ciclo in questo modo:

  

Qui, il risultato viene prodotto sia sul terminale che nel file file-comparison.out.

Si presume che nessun percorso nei due file di input contenga una nuova riga incorporata.

Il codice prima legge tutti i nomi di percorso da uno dei file in un array, files1, utilizzando mapfile. Lo faccio per evitare di dover leggere quel file più di una volta, poiché dovremo passare attraverso tutti quei nomi di percorso per ogni percorso nellaltro file. Noterai che invece di leggere da $filelist1 nel ciclo interno, mi limito a scorrere i nomi nellarray files1.

Commenti

  • ho bisogno di un programma completo nella shell bash
  • @santhoshreddy Vedi la risposta aggiornata.

Risposta

Il modo più semplice è utilizzare il comando diff.

esempio:

supponiamo che il primo file sia file1.txt e contiene:

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

e il secondo file 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. 

quindi possiamo usare diff per mostrarci automaticamente quali righe differiscono tra i due file con questo comando:

diff file1.txt file2.txt

e loutput sarà:

 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. 

Diamo unocchiata a cosa significa questo output. La cosa importante da ricordare è che quando diff ti descrive queste differenze, lo fa in un contesto prescrittivo: ti dice come cambiare il primo file per farlo corrispondere al secondo file. La prima riga delloutput del diff conterrà:

  • numeri di riga corrispondenti al primo file,
  • una lettera (a per aggiungere, c per modificare o d per eliminare )
  • numeri di riga corrispondenti al secondo file.

Nel nostro output precedente, “2,4c2,4 “ significa:” Linee 2 fino a 4 nel primo file deve essere modificato in modo che corrisponda alle linee 2 fino a 4 nel secondo file. ” Quindi ci dice quali sono quelle righe in ogni file:

  • Le righe precedute da un < sono le righe del primo file;
  • le righe precedute da> sono le righe del secondo file.
  • I tre trattini (“—“) separano semplicemente le righe del file 1 e del file 2.

Sorgente

Risposta

Ecco un puro script di shell bash per confrontare i file:

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

producendo:

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

I commenti su comandi specifici possono essere rimossi per uscire alla prima differenza vista e se desideri vedere ogni riga che viene letta.

Vedi la pagina su http://www.linuxjournal.com/content/reading-multiple-files-bash per i dettagli sui descrittori di file come “& 3”.

I migliori auguri … ciao, drl

Commenti

  • head è unutilità esterna e cosè $HOME/bin/context? E cosa significano i commenti in alto?
  • Head visualizza linput. Non gioca a parte nella differenziazione. Come con alcuni altri elementi, ” context ” è locale per mostrare il contesto dellambiente. Includendo questo, non ‘ dobbiamo discutere se le versioni dei sistemi operativi e delle utilità differiscono.
  • Mancava unesportazione, grazie per averlo notato.
  • Continuo a non ‘ capire il commento.Che cosè ‘ un ” utente esterno ” e perché dovresti impostare il percorso per uno script puro bash?
  • Scriviamo codice per il nostro negozio, quindi le impostazioni del percorso potrebbero differire per gli utenti esterni. Aggiungiamo che se appare necessario omettere le nostre impostazioni. Questo è un modello che viene modificato per visualizzare le informazioni sullambiente in cui è stato eseguito il codice. Se venisse trasformato in un codice di produzione, ad esempio per i client, invece di un codice demo, ‘ vorremmo essere sicuri che nessuno dei nostri percorsi locali venga utilizzato. for context è progettato in modo che se quel file non viene trovato non accadrà nulla, nemmeno un errore, ma non verrà elencata alcuna versione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *