যদি আপনার ফাইলের grep
নামগুলিতে নিউলাইনগুলি না থাকে তবে আপনি মিলে যাওয়া ফাইলগুলির নাম গ্রেপ প্রিন্ট করে একাধিক অনুরোধ এড়াতে পারবেন এবং ফলাফলগুলি গণনা করতে পারেন।
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
ম্যাচের সংখ্যা "${#matches[@]}"
।
এখানে ব্যবহারের কোনও উপায় থাকতে পারে grep --null -lw
তবে আউটপুটকে কীভাবে পার্স করবেন তা আমি নিশ্চিত নই । বাশের পরিবর্তে ডিলিমিটার var=( array elements )
ব্যবহারের উপায় \0
নেই \n
। হয়তো mapfile
বাশের বিল্টিন কি এটা করতে পারে? তবে সম্ভবত তা নয়, কারণ আপনি ডিলিমিটারটি নির্দিষ্ট করেছেন -d string
।
আপনি করতে পারেন count=$(grep -l | wc -l)
, তবে তারপরে আপনার দুটি বাহ্যিক প্রক্রিয়া রয়েছে যাতে আপনার পাশাপাশি grep
দুটি ফাইল পৃথকভাবে চালানো যেতে পারে । ( grep
বনাম wc
স্টার্টআপ ওভারহেডের মধ্যে পার্থক্যটি একেবারে পৃথক প্রক্রিয়া শুরু করার জন্য কাঁটাচামক + এক্সিকিউট + ডায়নামিক লিংক স্টাফের সাথে তুলনামূলক কম)।
এছাড়াও, আপনার সাথে কোন ফাইলের মিল রয়েছে wc -l
তা খুঁজে পাওয়া যায় না ।
অ্যারেতে প্রাপ্ত ফলাফলগুলির সাথে, এটি ইতিমধ্যে আপনি যা চান তা হতে পারে, বা ঠিক 1 টি মিল আছে, আপনি এটি প্রথম ইনপুট কিনা তা পরীক্ষা করতে পারেন।
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
# print the matching filenames
[[ -n $matches ]] && printf 'match in %s\n' "${matches[@]}"
# figure out which input position the name came from, if there's exactly 1.
if [[ "${#matches[@]" -eq 1 ]]; then
if [[ $matches == "$file1" ]];then
echo "match in file1"
else
echo "match in file2"
fi
fi
$matches
শর্টহ্যান্ড হ'ল ${matches[0]}
, প্রথম অ্যারে উপাদান।