Objek skrip yang saya buat adalah untuk membandingkan dua seri file. Nama file itu sendiri disimpan ke dalam dua file terpisah, satu jalur per baris. Ide saya adalah memiliki dua while read
loop, satu untuk setiap daftar nama file, tetapi bagaimana saya bisa mencampur dua loop bersama-sama?
while read compareFile <&3; do
if [[ ! $server =~ [^[:space:]] ]] ; then #empty line exception
continue
fi
echo "Comparing file - $compareFile"
if diff "$compareFile" _(other file from loop?_) >/dev/null ; then
echo Same
else
echo Different
fi
done 3</infanass/dev/admin/filestoCompare.txt
Saya harus dapat membandingkan file dari dua daftar yang berbeda secara bersamaan melalui dua saat membaca loop ... Apakah ini mungkin?
bash
shell-script
control-flow
mkrouse
sumber
sumber
diff
.diff
.Jawaban:
Anda tidak perlu dua loop; Anda hanya perlu membaca dari dua file dalam satu loop.
sumber
Metode 1: gunakan apa yang Anda ketahui
Karena Anda sudah tahu cara melompati satu file, Anda dapat menggabungkan file dan kemudian memproses file gabungan. Perintah tersebut
paste
menggabungkan dua file baris demi baris. Ini menempatkan tab di antara garis yang berasal dari dua file, jadi solusi ini mengasumsikan bahwa tidak ada tab di nama file Anda. (Anda dapat mengubah pemisah tetapi Anda harus menemukan karakter yang tidak ada dalam nama file.)Jika Anda ingin melewati baris kosong, Anda harus melakukannya di setiap file secara terpisah, karena
paste
mungkin cocok dengan baris kosong dari satu file dengan baris non-kosong dari file lain. Anda dapat menggunakangrep
untuk menyaring garis yang tidak kosong.Perhatikan bahwa jika kedua file memiliki panjang yang berbeda, Anda akan mendapatkan yang kosong
$file2
(terlepas dari daftar mana yang berakhir lebih dulu).Metode 2: loop dua file
Anda dapat menempatkan perintah yang kompleks seperti yang Anda inginkan dalam kondisi loop sementara. Jika Anda meletakkan
read file1 <&3 && read file2 <&4
maka loop akan berjalan selama kedua file memiliki satu baris untuk dibaca, yaitu sampai satu file habis.Jika Anda ingin melompati garis kosong, ini sedikit lebih rumit, karena Anda harus melompati dua file secara mandiri. Cara mudah adalah memecah masalah menjadi dua bagian: lewati baris kosong dari satu file, dan proses baris yang tidak kosong. Salah satu metode untuk melewati garis kosong adalah dengan memproses
grep
seperti di atas. Waspadai ruang yang diperlukan antara<
operator pengalihan dan<(
yang memulai susbtitusi perintah.Metode lain adalah menulis fungsi yang berperilaku seperti
read
tetapi melompati garis kosong. Fungsi ini dapat bekerja dengan memanggilread
satu lingkaran. Itu tidak harus menjadi fungsi, tetapi fungsi adalah pendekatan terbaik, baik untuk mengatur kode Anda dan karena potongan kode itu perlu dipanggil dua kali. Dalam fungsinya,${!#}
adalah turunan dari bash construct${!VARIABLE}
yang mengevaluasi nilai dari variabel yang namanya adalah nilaiVARIABLE
; di sini variabelnya adalah variabel khusus#
yang berisi jumlah parameter posisi, demikian${!#}
juga parameter posisi terakhir.sumber
-u
opsi bacaSalah satu pendekatan adalah menggunakan,
read -ra
bukan hanyaread
. Dengan asumsifilestoCompare.txt
2 kolom yang terkandung dengan nama file di masing-masing,read -ra
akan membaca kedua kolom pada saat yang sama dan menetapkannya ke dalam arraycompareFile
,. Array ini kemudian dapat diakses sehingga indeks 0 akan menjadi file pertama dan indeks 1 akan menjadi file ke-2 setiap kali melaluiwhile
loop.Contoh
Katakanlah saya punya file ini:,
filestoCompare.txt
dan ini berisi yang berikut:Perintah untuk membuka file ini adalah sebagai berikut:
Jika 2 file tersebut memang file yang terpisah seperti:
Mereka dapat bergabung bersama dengan
paste
perintah seperti ini:Berikut isi list1and2:
sumber
join
melakukannya dulu.paste
untuk bergabung dengan 2 file? Apakah itu akan membuat Anda undownvote?