পদ্ধতি 1: আপনি যা জানেন তা ব্যবহার করুন
যেহেতু আপনি ইতিমধ্যে একটি ফাইলের উপর কীভাবে লুপ করবেন তা জানেন, আপনি ফাইলগুলি একত্রিত করতে পারেন এবং তারপরে সংযুক্ত ফাইলগুলি প্রক্রিয়া করতে পারেন। কমান্ডটি paste
লাইনে দুটি ফাইলের সাথে যুক্ত হয়। এটি দুটি ফাইল থেকে আগত রেখাগুলির মধ্যে একটি ট্যাব রাখে, সুতরাং এই সমাধানটি ধরে নেয় যে আপনার ফাইলের নামগুলিতে কোনও ট্যাব নেই। (আপনি বিভাজক পরিবর্তন করতে পারেন তবে আপনাকে এমন একটি অক্ষর খুঁজে পেতে হবে যা কোনও ফাইলের নামে উপস্থিত নেই))
paste -- "$list1.txt" "list2.txt" |
while IFS=$'\t' read -r file1 file2 rest; do
diff -q -- "$file1" "$file2"
case $? in
0) status='same';;
1) status='different';;
*) status='ERROR';;
esac
echo "$status $file1 $file2"
done
আপনি যদি খালি লাইনগুলি এড়িয়ে যেতে চান তবে আপনার প্রতিটি ফাইলটিতে এটি আলাদাভাবে করা দরকার, যেহেতু paste
অন্য ফাইল থেকে একটি ফাঁকা রেখার সাথে একটি ফাইলের ফাঁকা রেখার সাথে মিল থাকতে পারে। আপনি grep
নন-ফাঁকা লাইনগুলি ফিল্টার করতে ব্যবহার করতে পারেন ।
paste -- <(grep '[^[:space:]]' "$list1.txt") <(grep '[^[:space:]]' "list2.txt") |
while IFS=$'\t' read -r file1 file2 rest; do
…
মনে রাখবেন যে দুটি ফাইলের দৈর্ঘ্য যদি আলাদা হয় তবে আপনি একটি খালি পাবেন $file2
(কোন তালিকাটি প্রথমে শেষ হয়েছে তা নির্বিশেষে)।
পদ্ধতি 2: দুটি ফাইলের উপর লুপ করুন
উইন্ড লুপের অবস্থায় আপনি যেমন চান তেমন কমপ্লিট কমান্ড রাখতে পারেন। যদি আপনি রাখেন read file1 <&3 && read file2 <&4
তবে লুপটি যতক্ষণ না উভয় ফাইলের পড়ার জন্য একটি লাইন থাকবে, অর্থাত্ একটি ফাইল শেষ না হওয়া অবধি চলবে।
while read -u 3 -r file1 && read -u 4 -r file2; do
…
done 3<list1..txt 4<list2.txt
আপনি যদি ফাঁকা রেখাগুলি ছাড়তে চান তবে এটি কিছুটা জটিল। কারণ আপনাকে দুটি ফাইলে স্বাধীনভাবে স্কিপিং করতে হবে। সহজ উপায় হ'ল সমস্যাটি দুটি ভাগে বিভক্ত করা: একটি ফাইল থেকে ফাঁকা লাইনগুলি এড়িয়ে চলুন এবং খালি ফাঁকা লাইনগুলি প্রক্রিয়া করুন। ফাঁকা লাইনগুলি এড়িয়ে যাওয়ার একটি পদ্ধতি grep
উপরের মত প্রক্রিয়া করা । <
পুনঃনির্দেশ অপারেটর এবং এটি <(
একটি আদেশ কমান্ড শুরু করার মধ্যে প্রয়োজনীয় স্থানটির জন্য সন্ধান করুন ।
while read -u 3 -r file1 && read -u 4 -r file2; do
…
done 3< <(grep '[^[:space:]]' "$list1.txt") 4< <(grep '[^[:space:]]' "list2.txt")
আরেকটি পদ্ধতি হ'ল একটি ফাংশন লিখুন যা এর মতো আচরণ করে read
তবে ফাঁকা লাইনগুলি এড়িয়ে যায়। এই ফাংশনটি read
একটি লুপে কল করে কাজ করতে পারে । এটি কোনও ফাংশন হওয়ার দরকার নেই, তবে আপনার কোডটি সংগঠিত করার জন্য একটি ফাংশন হ'ল সর্বোত্তম পন্থা এবং কারণ সেই অংশের কোডটি দু'বার কল করা প্রয়োজন। ফাংশনে, ${!#}
বাশ কন্সট্রাক্টের একটি উদাহরণ ${!VARIABLE}
যা ভেরিয়েবলের নামের মূল্য যা মূল্য হিসাবে মূল্যায়ন করে VARIABLE
; এখানে ভ্যারিয়েবলটি হল একটি বিশেষ ভেরিয়েবল #
যা পজিশনাল প্যারামিটারের সংখ্যা ধারণ করে, তাই ${!#}
শেষ পজিশনাল প্যারামিটার।
function read_nonblank {
while read "$@" &&
[[ ${!#} !~ [^[:space:]] ]]
do :; done
}
while read_nonblank -u 3 -r file1 && read_nonblank -u 4 -r file2; do
…
done 3<list1..txt 4<list2.txt
diff
।