Bagaimana cara membandingkan dua file dengan skrip shell?

10

Diberikan dua file, saya ingin menulis skrip shell yang membaca setiap baris dari file1 dan memeriksa apakah ada di file2. Jika suatu baris tidak ditemukan maka harus menghasilkan dua file berbeda dan keluar. File dapat berisi angka kata atau apa pun. Sebagai contoh :

file1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

Dalam hal ini dua file harus sama. jika file2 memiliki "halo !!!" alih-alih "halo" maka file berbeda. Saya menggunakan skrip bash. Bagaimana saya bisa melakukan ini. Itu tidak penting bahwa saya perlu melakukannya dalam lingkaran bersarang tetapi itulah yang saya pikir adalah satu-satunya cara. Terima kasih atas bantuan Anda.

0x0
sumber

Jawaban:

9

Dalam bash:

diff --brief <(sort file1) <(sort file2)
Ignacio Vazquez-Abrams
sumber
Bagaimana jika file tersebut adalah file csv. apakah penyortiran masih berfungsi?
0x0
sorttidak peduli tentang konten yang tepat kecuali Anda memberi tahu.
Ignacio Vazquez-Abrams
Apakah mungkin menemukan garis yang berbeda?
0x0
Hapus --briefdan tambahkan opsi format, mis -u.
Ignacio Vazquez-Abrams
10

diffmenetapkan status keluarnya untuk menunjukkan apakah file sama atau tidak. Status keluar dapat diakses dalam variabel khusus $?. Anda dapat memperluas jawaban Ignacio dengan cara ini:

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
Doug Harris
sumber
3
Anda bisa melakukannya if diff ... >/dev/nulltanpa tanda kurung dan variabel.
Dijeda sampai pemberitahuan lebih lanjut.
1

Menambahkan ini karena saya rasa [[]] && || konstruknya cukup rapi:

#!/bin/bash

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

Harus juga berfungsi:

comm -3 file1 file2

Saya pikir ini karakter yang cukup untuk jawaban ...

mpez0
sumber
1

Sementara diffjawaban yang sangat bagus, saya mungkin akan menggunakan cmpsebagai gantinya yang khusus untuk melakukan perbandingan byte dengan byte dari dua file.

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

Karena itu, ini memiliki bonus tambahan untuk dapat membandingkan file biner.

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

Saya dituntun untuk percaya bahwa ini lebih cepat daripada menggunakan diffwalaupun saya belum mengujinya secara pribadi.

Richard
sumber
Bukankah "file itu berbeda", buka dulu? Tes if menanyakan apakah sesuatu itu benar, yaitu kode pengembalian bukan nol. Jika file cocok, cmp mengembalikan 0 (per halaman manual), dan itu harus menjadi kasus kedua.
user8162
@ user8162 Apa yang Anda katakan masuk akal, namun saya baru saja mengujinya dan itu adalah jalan yang benar. Saya tidak yakin mengapa harus jujur.
Richard