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.

Jawaban:



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

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")

1

Harus juga berfungsi:

comm -3 file1 file2

Saya pikir ini karakter yang cukup untuk jawaban ...


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.