فرز (يونكس)

في مجال الحوسبة ، يُعدّ الأمر sort برنامجًا قياسيًا يعمل عبر سطر الأوامر في أنظمة التشغيل Unix والأنظمة الشبيهة بها ، حيث يقوم بطباعة أسطر مُدخلاته أو مُجمّعات جميع الملفات المُدرجة في قائمة الوسائط، مُرتبةً حسب الترتيب. ويتم الترتيب بناءً على مفتاح فرز واحد أو أكثر مُستخرج من كل سطر من المُدخلات. افتراضيًا، تُعتبر المُدخلات بأكملها مفتاح فرز. وتُستخدم المسافة الفارغة كفاصل افتراضي بين الحقول. يدعم الأمر عددًا من خيارات سطر الأوامر التي قد تختلف باختلاف التطبيق. على سبيل المثال، يُؤدي استخدام الخيار " " إلى عكس ترتيب الفرز. ويتأثر ترتيب الفرز بإعدادات اللغة المحلية للبيئة . [ 1 ]-r

تاريخ

تم تطبيق أمر sortاستدعاء وظيفة فرز عامة لأول مرة في نظام Multics . [ 2 ] لاحقًا، ظهر في الإصدار الأول من يونكس . كتب هذا الإصدار في الأصل كين تومسون في مختبرات AT&T Bell . بحلول الإصدار الرابع، عدّله تومسون لاستخدام الأنابيب ، لكن الأمر sort احتفظ بخيار تسمية ملف الإخراج لأنه كان يُستخدم لفرز الملف في مكانه. في الإصدار الخامس ، ابتكر تومسون الرمز "-" لتمثيل المدخلات القياسية . [ 3 ]

sortيُعد جزءًا من دليل قابلية النقل X/Open الإصدار 2 (1987). ومن هناك تم توريثه إلى POSIX . [ 4 ]

قام مايك هارتل وبول إيغرت بكتابة نسخة دالة الفرز المضمنة في GNU coreutils . [ 1 ] تستخدم هذه النسخة خوارزمية فرز الدمج . وهي توفر خيار الفرز بالتوازي، إلا أن تحسن الأداء يتضاءل بعد 8 خيوط معالجة. [ 5 ] كما توفر GNU parallel غلافًا لتنفيذ استدعاءات متوازية لدالة الفرز مع خصائص مماثلة لتحسين الأداء: على نظام ذي 48 نواة، يبلغ التسارع حوالي 3 أضعاف. [ 6 ]

تم أيضًا نقل أمر الفرز إلى نظام التشغيل IBM i ، ويمكن الوصول إليه من خلال Qshell المتوافق مع POSIX . [ 7 ]

المنافذ غير POSIX

تتوفر أوامر مماثلة على العديد من أنظمة التشغيل الأخرى، على سبيل المثال، يعد أمر الفرز جزءًا من أدوات ASCII MSX -DOS2 لإصدار MSX-DOS 2. [ 8 ]

يوفر مشروع "uutils" تطبيقًا متعدد المنصات sortمكتوبًا بلغة Rust ، مع دعم جميع خيارات GNU coreutil. يستخدم هذا المشروع دالة par_sort_byor par_sort_unstable_byمن مكتبة Rayon، وهي مكتبة Rust متعددة الخيوط، حيث يُنفذ إما فرز دمج تكيفي مستوحى من timsort أو نوعًا مختلفًا من الفرز السريع الذي يُفشل الأنماط . [ 9 ]

بناء الجملة

فرز [خيار]... [ملف]...

بدون FILE، أو عندما FILEيكون -، يقرأ الأمر من المدخلات القياسية .

حدود

في الجدول أدناه، يشير "Short" إلى دعم الشكل المختصر (المكون من حرف واحد) للخيار فقط. أما الخيارات الطويلة فهي في الأصل امتداد من GNU وليست جزءًا من أي إصدار من SUS أو POSIX. وقد تم اعتمادها لاحقًا أيضًا من قِبل FreeBSD.

اسموصفSUS / POSIXالخطة 9جحيمفري بي إس ديلينكسMSX-DOSنظام التشغيل IBM i
-b ، --ignore-leading-blanksيتجاهل ro المسافات البادئة.قصيرقصيرلانعمنعملاقصير
-c ، --checkتأكد من أن ملف الإدخال مُرتب.لاقصيرلانعمنعملاقصير
-C ، --check= < صامت | هادئ >يشبه الخيار -c، لكنه لا يُبلغ عن السطر الأول الخاطئ.لالالانعمنعملالا
-d ، --dictionary-orderلا يأخذ في الاعتبار سوى الفراغات والأحرف الأبجدية الرقمية.قصيرقصيرلانعمنعملاقصير
-f ، --ignore-caseقم بطي الأحرف الصغيرة لتصبح أحرفاً كبيرة.قصيرقصيرلانعمنعملاقصير
-g ، --general-numeric-sort ، --sort=general-numericيقارن وفقًا للقيمة العددية العامة.قصيرقصيرلانعمنعملالا
-h ، --human-numeric-sort ، --sort=human-numericقارن الأرقام التي يمكن قراءتها من قبل الإنسان (على سبيل المثال، 2K 1G).قصيرلالانعمنعملالا
-i ، --ignore-nonprintingلا يأخذ في الاعتبار إلا الأحرف القابلة للطباعة.قصيرقصيرلانعمنعملاقصير
-k , --key= POS1 [, POS2 ]ابدأ المفتاح عند الموضع 1 (الأصل 1)، وأنهِه عند الموضع 2 (نهاية السطر الافتراضية).لالالانعمنعملالا
دمج فقط؛ يُفترض أن ملفات الإدخال مُرتبة مسبقًا.لاقصيرلانعمنعملاقصير
-M ، --month-sort ، --sort=monthيقارن (غير معروف) < 'يناير' < ... < 'ديسمبر'.قصيرقصيرلانعمنعملالا
-n ، --numeric-sort ، --sort=numericيقارن وفقًا للقيمة العددية للسلسلة النصية.قصيرقصيرقصيرنعمنعملاقصير
-o OUTPUTيستخدم ملف الإخراج بدلاً من الإخراج القياسي.لاقصيرلانعمنعملاقصير
-r ، --reverseيعكس نتيجة المقارنات.قصيرقصيرقصيرنعمنعملاقصير
-R ، --random-sort ، --sort=randomيُعيد ترتيب النغمات، لكنه يُجمّع المفاتيح المتطابقة. انظر أيضًا: shufلالالانعمنعملالا
-sيعمل على تثبيت عملية الفرز عن طريق تعطيل المقارنة كخيار أخير.لالالانعمنعملالا
-S الحجم ، --buffer-size= الحجماستخدم الحجم لتحديد الحد الأقصى لحجم مخزن الذاكرة المؤقت.لالالانعملالالا
-t char , --field-separator= charيستخدم حرفًا بدلاً من الانتقال من حقل غير فارغ إلى حقل فارغ. بعبارة أخرى، يُستخدم حرف الجدولة للفصل بين الحقول .لاقصيرلانعمنعملاقصير
-T dir , --temporary-directory= dirيستخدم الأمر dir للملفات المؤقتة.لاقصيرلانعمنعملالا
-u ، --uniqueمعالجة فريدة لحذف جميع الأسطر باستثناء سطر واحد في كل مجموعة من الأسطر التي تحتوي على مفاتيح متساوية.لاقصيرلانعمنعملاقصير
-V ، --version-sortترتيب طبيعي (للأرقام) داخل النصلالالانعمنعملالا
-wيشبه الخيار -i، لكنه يتجاهل علامات الجدولة والمسافات فقط.لانعملالالالالا
-z ، --zero-terminatedأنهِ الأسطر بـ 0 بايت، وليس بسطر جديد.لالالانعمنعملالا
--يساعداعرض المساعدة واخرجلالالانعمنعملالا
--إصدارعرض معلومات الإصدار والخروجلالالانعمنعملالا
/Rيعكس نتيجة المقارنات.لالالالالانعملا
/Sحدد عدد الأرقام لتحديد عدد الأرقام التي يجب تقييمها في كل سطر.لالالالالانعملا
فرز حسب رمز ASCII.لالالالالانعملا
قم بتضمين الملفات المخفية عند استخدام الأحرف البديلة.لالالالالانعملا

أمثلة

فرز ملف بالترتيب الأبجدي

دليل هواتف القطط $ سميث، بريت 555-4321 دو، جون 555-1234 دو، جين 555-3214 أفيري، كوري 555-4132 فوغارتي، سوزي 555-2314
فرز دليل الهاتف : أفيري، كوري 555-4132 ، دو، جين 555-3214 ، دو، جون 555-1234، فوغارتي، سوزي 555-2314، سميث، بريت 555-4321

فرز حسب الرقم

يُتيح هذا -nالخيار للبرنامج فرز الملفات وفقًا لقيمتها العددية. يُنتج الأمر du مخرجات تبدأ برقم، وهو حجم الملف، لذا يمكن تمرير هذه المخرجات إلى الأمر sort لإنتاج قائمة بالملفات مرتبة حسب حجمها (تصاعديًا).

$ دو / بن / * | فرز -ن 4 /bin/اسم المجال 24 /bin/ls 102 /bin/sh 304 /bin/csh

يقوم الأمر find مع خيار ls بطباعة أحجام الملفات في الحقل السابع، وبالتالي يتم إنتاج قائمة بملفات LaTeX مرتبة حسب حجم الملف بواسطة:

$ find . -name "*.tex" -ls | sort -k 7n 

الأعمدة أو الحقول

استخدم -kخيار الفرز حسب عمود معين. على سبيل المثال، استخدم " -k 2" للفرز حسب العمود الثاني. في الإصدارات القديمة من برنامج الفرز، كان هذا +1الخيار يجعل البرنامج يفرز البيانات حسب العمود الثاني ( +2وحسب العمود الثالث، وهكذا). هذا الاستخدام مُهمل.

$ cat zipcode Adam 12345 Bob 34567 Joe 56789 Sam 45678 Wendy 23456
$ sort -k 2n zipcode Adam 12345 Wendy 23456 Bob 34567 Sam 45678 Joe 56789

فرز حسب حقول متعددة

يتيح لك هذا -k m,nالخيار الفرز بناءً على مفتاح قد يتكون من عدة حقول (البدء من العمود m، والانتهاء عند العمود n):

$ cat quota fred 2000 bob 1000 an 1000 chad 1000 don 1500 eric 500
$ sort -k2,2n -k1,1 quota eric 500 an 1000 bob 1000 chad 1000 don 1500 fred 2000

هنا، يتم الفرز الأول باستخدام العمود الثاني. -k2,2nيحدد هذا الخيار الفرز بناءً على المفتاح الذي يبدأ وينتهي بالعمود الثاني، والفرز رقميًا. في حال -k2استخدام خيار آخر، سيبدأ مفتاح الفرز من العمود الثاني ويمتد إلى نهاية السطر، شاملًا جميع الحقول بينهما. -k1,1يحدد هذا الخيار كسر التعادل باستخدام القيمة في العمود الأول، مع الفرز أبجديًا افتراضيًا. لاحظ أن كلاً من "بوب" و"تشاد" لهما نفس الحصة، ويتم فرزهما أبجديًا في الناتج النهائي.

فرز ملف مفصول بعلامة الأنبوب

$ sort -k2,2,-k1,1 -t '|' zipcode Adam|12345 Wendy|23456 Sam|45678 Joe|56789 Bob|34567

فرز ملف مفصول بعلامات الجدولة

يتطلب فرز ملف يحتوي على قيم مفصولة بعلامات جدولة تحديد علامة الجدولة كفاصل بين الأعمدة. يستخدم هذا المثال التوضيحي صيغة علامة الدولار في الصدفة [ 10 ] [ 11 ] لتحديد علامة الجدولة كسلسلة هروب C.

$ sort -k2,2 -t $'\t' phonebook Doe, John 555-1234 Fogarty, Suzie 555-2314 Doe, Jane 555-3214 Avery, Cory 555-4132 Smith, Brett 555-4321

رتب بالترتيب العكسي

الخيار -rببساطة يعكس ترتيب الفرز:

$ sort -rk 2n zipcode Joe 56789 Sam 45678 Bob 34567 Wendy 23456 Adam 12345

فرز عشوائياً

يحتوي تطبيق GNU على -R --random-sortخيار يعتمد على التجزئة؛ وهذا ليس خلطًا عشوائيًا كاملًا لأنه يرتب الأسطر المتطابقة معًا. أما الفرز العشوائي الحقيقي فيوفره برنامج shuf في أنظمة Unix .

فرز حسب الإصدار

تتضمن نسخة GNU -V --version-sortخيارًا لفرز أرقام الإصدارات ضمن النصوص بشكل طبيعي. يتم تقسيم سلسلتي نصيتين للمقارنة إلى مجموعات من الأحرف ومجموعات من الأرقام. تُقارن مجموعات الأحرف أبجديًا رقميًا، بينما تُقارن مجموعات الأرقام رقميًا (أي مع حذف الأصفار البادئة، وكلما زاد عدد الأرقام كان الرقم أكبر، وإلا فإن الأرقام المختلفة في أقصى اليسار هي التي تحدد النتيجة). تُقارن المجموعات من اليسار إلى اليمين، وتُحدد أول مجموعة غير متساوية في هذه العملية النص الأكبر. يعمل هذا مع عناوين IP، وسلاسل إصدارات حزم Debian، والمهام المشابهة التي تتضمن أرقامًا ذات أطوال متغيرة ضمن السلاسل النصية.

انظر أيضاً

مراجع

  1. 1 2دليل مستخدم لينكس – أوامر المستخدم من Manned.orgsort(1)  
  2. "أوامر متعددة" . www.multicians.org .
  3. ماكيلروي، دكتور في الطب (1987). قارئ أبحاث يونكس: مقتطفات مشروحة من دليل المبرمج، 1971-1986 (ملف PDF) (تقرير فني). مختبرات بيل. 139.
  4. مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Groupsort  
  5. "استدعاء الفرز (GNU Coreutils 9.8)" .
  6. "الاسم — وثائق GNU Parallel 20250922" . www.gnu.org .
  7. آي بي إم . "برمجة Qshell لنظام IBM System i الإصدار 7.2" (ملف PDF) . آي بي إم . تم الاطلاع عليه بتاريخ 5 سبتمبر 2020 .
  8. ^ "دليل مستخدم أدوات MSX-DOS2 - أدوات MSX-DOS2 ユ ザ ズ マ ニ ュ ア ル" . 1 أبريل 1993 عبر أرشيف الإنترنت.
  9. "ParallelSliceMut in rayon::slice - Rust" . docs.rs .
  10. "دليل مرجع GNU Bash، لـ Bash، الإصدار 4.2: القسم 3.1.2.4 اقتباس ANSI-C" . مؤسسة البرمجيات الحرة، 28 ديسمبر 2010. تاريخ الاطلاع: 1 فبراير 2013. تُعامل الكلمات التي على شكل $'string' معاملة خاصة. تُستبدل الكلمة بـ string، مع استبدال الأحرف التي تم تهريبها بواسطة الشرطة المائلة العكسية وفقًا لمعيار ANSI C.
  11. فاولر، جلين س.؛ كورن، ديفيد ج .؛ فو، كيم-فونغ. "أسئلة وأجوبة حول كورن شيل" . مؤرشف من الأصل بتاريخ 27 مايو 2013. تم الاطلاع عليه بتاريخ 3 مارس 2015. أُضيفت صيغة السلسلة النصية $'...' إلى ksh93 لحل مشكلة إدخال الأحرف الخاصة في النصوص البرمجية. وهي تستخدم قواعد ANSI-C لترجمة السلسلة بين '...'.

للمزيد من القراءة