0

أمر sort لترتيب المُخرجات على لينكس

السلام عليكم ورحمة الله.

التعامل مع المُخرَجات عن طريق سطر الأوامر على غنو/لينوكس فن يُمَكِّن مَن أتقنه من الوصول إلى مستوى عالٍ من الإنتاجية قد لا يتصوّره الكثيرون. في هذه التدوينة التي ستكون مدخلا لتدوينات قادمة في هذا المجال إن شاء الله سنتطرّق إلى أمر sort لترتيب المُخرجات على نظام غنو/لينوكس. عندما أقول مُخرج فإن المقصود قد يكون ملفا نصّيا أو نتيجة أمر آخر. هذا المُخرج هو مدخل للأمر الذي نحنُ في طور الحديث عنهُ، أي أمر sort في حالتنا.

استخدام أمر sort لترتيب المُخرجات

لشرح طريقة عمل هذا الأمر فسنستعين بملف، وليكن اسمه file، يحوي الأسطر التالية:

أحمد
محمد
عبد الله
فاطمة
أم كلثوم
عبد الرحمن
خديجة

كما ترون كل سطر يحوي اسما. لنستخدم أمر sort لترتيب هذه الأسماء:

sort file
الترتيب عن طريق أمر sort

الترتيب عن طريق أمر sort

النتيجة هي ظهور الأسطر مرتبّةً ترتيبا ألفبائيا. إن أردنا الاحتفاظ بهذه النتيجة في ملف جديد فيمكننا ذلك عن طريق إعادة توجيه نتيجة الأمر أعلاه كما يلي:

sort file > sorted_file

العلامة < تعني أننا نُريد أن نحتفِظ بناتج الأمر قبلها (sort file) في ملف اسمه sorted_file. إذا كان هذا الملف موجودا في مجلّد العمل فإن مُحتواه سيُبدل بناتج الأمر sort file، إما إن لم يكن موجودا فإنه سيُنشأ.

خيار r- لقلب الترتيب

إذا أردنا قلبَ الترتيب فالخيار r- يفي بهذا الغرض:

sort -r file
الترتيب بالمقلوب - أمر sort

الترتيب بالمقلوب – أمر sort

خيار n- للترتيب العددي

في الفقرات السّابقة كان مُحتوى الملف نصيا، ماذا لو كان لدينا أعداد بدلا من كلمات أو جمل ؟ فلنجرِّب.

محتوى الملف الآن هو كالتالي:

5
2
12
1
8
56

نُنفِّذ الأمر

sort file

النتيجة:

أمر sort - ملف مكوَّن من أعداد

أمر sort – ملف مكوَّن من أعداد

الترتيب هنا كما يظهر هو ترتيب ألفبائي ولكنّنا نبحث عن الترتيب العددي، لذلك نستخدم الخيار n- :

sort -n file

النتيجة:

أمر sort - الترتيب العددي

أمر sort – الترتيب العددي

حتى الآن اكتفينا بإظهار نتيجة أمر sort، إذا أردنا الاحتفاظ بها في ملف آخر (وليكن اسمه result مثلا) فإن الأمر يُكتب كالتالي:

sort file > result

العلامة < تعني احتفظ بنتيجة الأمر الأول (sort file) في الملف المذكور بعدها (result). استخدام علامة < ليسَ خاصا بأمر sort.

يُمكننا أيضا الاستعانة بخيار o- فنحصُل على نفس النتيجة:

sort file -o result

الاستخدام المُتقدم لأمر sort

يُوفِّر الأمر sort بعض الوظائف المهمة نذكر منها:

 إلغاء الأسطر المتكرّرة وذلك باستخدام خيار u- كما يلي:

sort -u file

تغيير الصف الذي يتم حسبه الترتيب.

مثلا لنفرض أن لدينا الملف التالي، حيثُ الصف الأول يحوي اسم الفرد الشخصي، الثاني اسمه العائلي، الثالث سنة الميلاد والرابع شهر الميلاد.

Mohamed Aly 1980 12
Issam Mohamed 1987 5
Fatima Ibrahim 1987 10
Mariem Abbass 1970 11

عند تنفيذ الأمر sort file فإن النتيجة هي (غيّرتُ التنسيقَ قليلا حتى تتضح الصّفوف):

Fatima  Ibrahim    1987    10
Issam   Mohamed    1987    5
Mariem  Abbass     1970    11
Mohamed Aly        1980    12

الترتيب كما يظهر جرى حسب الصف الأول (الاسم الشخصي). ماذا لو أردنا الترتيب حسب الاسم العائلي (الصف الثاني)؟

الجواب يأتي به الخيار k- الذي يجب أن يُلصق به رقم الصف المُراد الترتيب على أساسه. k2- للصف الثاني مثلا.

sort -k2 file

النتيجة:

Mariem   Abbass    1970    11
Mohamed  Aly       1980    12
Fatima   Ibrahim   1987    10
Issam    Mohamed   1987    5

للترتيب حسب شهر الميلاد (الصف الرابع):

sort -k4 file

النتيجة:

Fatima   Ibrahim  1987    10
Mariem   Abbass   1970    11
Mohamed  Aly      1980    12
Issam    Mohamed  1987    5

يوجد خطأ! أليس كذلك ؟ هذا لأننا أما صف مكوَّن من أعداد لذا يجب استخدام الخيار n-

sort -n -k4 file

النتيجة:

Issam    Mohamed  1987    5
Fatima   Ibrahim  1987    10
Mariem   Abbass   1970    11
Mohamed  Aly      1980    12

قد تتساءل على أي معيار يُحدَّد الصف الذي تنتمي له الكلمة أو العدد؟ والجواب هو أنه عند عدم تحديد فاصل بين الصّفوف فإن المسافة تُعتبر هي الفاصل بين الصفوف؛ وهو أمر غير مناسب في حال كانت الصفوف تحوي جملا. سنفترض أن لدينا ملف csv (الصفوف يفصل بينها علامة 😉 يتكون من ثلاثة صفوف (الاسم الكامل، سنة وشهر الميلاد) ويحوي الأسطر التالية:

Mohamed    Aly;1980;12
Issam Mohamed;1985;5
Fatima Ibrahim;1987;10
Mariem Abbass;1970;11

لاحظ أن الصف الأول يحوي مسافات. لترتيب هذه الأسطر حسب الصف الثاني (سنة الميلاد) نستخدم الأمر:

sort "-t;" -n -k2 file

في الحالة العادية لا نحتاج لعلامتي “” ولكن بما أن علامة ;  كلمة محجوزة في shell فإننا نضع الخيار بين علامتي “” للدلالة على أننا نستخدم ; بغير دلالتها التي تستخدمها بها لغة Shell.

النتيجة:

Mariem Abbass;1970;11
Mohamed  Aly;1980;12
Fatima Ibrahim;1987;10
Issam Mohamed;1987;5

يمكن دمج الخيارين k- و n- هكذا:

sort "-t;" -k3n file

هنا k3n- تعني أن الترتيب يجب أن يكون حسب الصف الثالث وأننا نُريد ترتيبا عدديا وليس ألفبائيا.

استخدام أكثر من صف للترتيب

في الفقرة السابقة استخدمنا الصف الثاني للترتيب (سنة الميلاد) وكما يظهر فإنه يوجد شخصان لديهما نفس سنة الميلاد؛ ماذا لو أردنا ترتيب هذين الشخصين حسب شهر الميلاد (الصف الثالث)؟ أين أن الترتيب سيكون على أساس سنة الميلاد ثم شهر الميلاد ؟
في هذه الحالة يُمكن إضافة خيار k- إلى أمر sort مرة أخرى كما يلي:

sort "-t;" -k2n -k3n file

النتيجة:

Mariem Abbass;1970;11
Mohamed    Aly;1980;12
Issam Mohamed;1987;5
Fatima Ibrahim;1987;10

الأمر السابق يُقرأ: اعتمد علامة ; للفصل بين الصفوف واستخدم الصف الثاني للترتيب العددي ثم الصف الثالث للترتيب العددي إذا كان مُحتوى الصف الثاني متطابقا.

بهذا أختتم هذه التدوينة. طبعا خيارات أمر sort لا تقتصر على الخيارات المذكورة أعلاه، يمكن معرفة المزيد عن طريق أمر man sort. صفحة أوامر لينوكس تحوي تدوينات أخرى من المفيد الاطلاع عليها. إذا واجهتَ أي مشكلة أو كان لدي تعليق أو إضافة فصندوق التعليقات موجود لهذا الغرض.

لا تنسَ أن أزرار المشاركة على الشبكة الاجتماعية موجودة لتعميم الفائدة فلاتبخل باستخدامها إذا كان هذا المحتوى مفيدا من وجهة نظرك.

للحصول على آخر الإضافات مباشرة بعد نشرها يُرجى الاشتراك في تغذيات RSS  أو على تطبيق فيدلي عبر الضغط على الزر أدناه

تابعنا على تطبيق فيدلي

فضلًا.. شارك هذا المقال 🙂

Email this to someoneTweet about this on TwitterShare on FacebookShare on Google+Share on StumbleUpon

zeine77

محمد أحمد ولد العيل، مهندس نظم معلومات. مهتم بنظام تشغيل غنو/لينوكس والبرمجيات الحرّة والمفتوحة المصدر. أسعى من خلال هذه المدوّنة لإثراء المحتوى العربي على الشّبكة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *