نوع
La نوع برنامه محتویات ورودی استاندارد یا یک یا چند فایل مشخص شده در خط فرمان را مرتب می کند و نتایج را به خروجی استاندارد می فرستد. با استفاده از همان تکنیکی که با آن استفاده کردیم گربه، می توانیم پردازش ورودی استاندارد را مستقیماً از صفحه کلید نشان دهیم:
[me@linuxbox ~]$ sort > foo.txt
CBA
[me@linuxbox ~]$ cat foo.txt
abc
[me@linuxbox ~]$ sort > foo.txt
CBA
[me@linuxbox ~]$ cat foo.txt
abc
پس از وارد کردن دستور، حروف c، b و a را تایپ می کنیم و یک بار دیگر می نویسیم Ctrl-d برای نشان دادن پایان پرونده سپس فایل حاصل را مشاهده می کنیم و می بینیم که خطوط اکنون به ترتیب مرتب شده ظاهر می شوند.
پس از نوع می تواند چندین فایل را در خط فرمان به عنوان آرگومان بپذیرد، این امکان وجود دارد ادغام کردن چندین فایل در یک کل مرتب شده واحد. به عنوان مثال، اگر ما سه فایل متنی داشتیم و می خواستیم آنها را در یک فایل مرتب شده ترکیب کنیم، می توانیم کاری شبیه به این انجام دهیم:
مرتب سازی file1.txt file2.txt file3.txt > final_sorted_list.txt
مرتب سازی file1.txt file2.txt file3.txt > final_sorted_list.txt
مرتب سازی چندین گزینه جالب دارد. در اینجا یک لیست جزئی وجود دارد:
جدول 20-1: گزینه های مرتب سازی رایج
گزینه | گزینه طولانی | توضیحات: |
-b | --نادیده گرفتن-پیشرو-جاهای خالی | به طور پیش فرض، مرتب سازی انجام می شود |
کل خط، شروع با | ||
اولین کاراکتر در خط این | ||
گزینه باعث می شود مرتب سازی نادیده گرفته شود | ||
فضاهای پیشرو در خطوط و | ||
مرتب سازی را بر اساس اولی محاسبه می کند | ||
کاراکتر بدون فضای سفید روی | ||
خط. | ||
-f | --نادیده گرفتن مورد | مرتب سازی را به حروف بزرگ و کوچک حساس می کند. |
-n | - مرتب سازی عددی | مرتب سازی را بر اساس ارزیابی عددی یک رشته انجام می دهد. استفاده از این گزینه اجازه می دهد تا مرتب سازی بر روی مقادیر عددی به جای مقادیر حروف الفبا انجام شود. |
-r | --معکوس | مرتب سازی به ترتیب معکوس نتایج وارد شده است |
نزولی به جای صعود | ||
سفارش. | ||
-k | -- کلید =field1[,field2] | مرتب سازی بر اساس یک فیلد کلید واقع شده است |
از جانب field1 به field2 به جای آن | ||
کل خط بحث زیر را ببینید. | ||
-m | --ادغام | هر آرگومان را به عنوان نام در نظر بگیرید |
از یک فایل از پیش مرتب شده ادغام چندگانه | ||
فایل ها را به یک نتیجه مرتب شده منفرد تبدیل کنید | ||
بدون انجام هیچ اضافی | ||
مرتب سازی. | ||
-o | --خروجی=پرونده | ارسال خروجی مرتب شده به پرونده نسبتا |
نسبت به خروجی استاندارد | ||
-t | --field-separator=ارابه | جداکننده فیلد را تعریف کنید |
شخصیت. به طور پیش فرض فیلدها هستند | ||
با فاصله یا برگه ها از هم جدا شده اند. |
اگرچه بسیاری از گزینه های بالا کاملاً توضیحی هستند، برخی از آنها اینطور نیستند. اول، بیایید نگاه کنیم -n گزینه ای که برای مرتب سازی عددی استفاده می شود. با این گزینه می توان مقادیر را بر اساس مقادیر عددی مرتب کرد. ما می توانیم این را با مرتب سازی نتایج نشان دهیم du دستور تعیین بزرگترین کاربران فضای دیسک. به طور معمول، du فرمان نتایج یک خلاصه را به ترتیب نام مسیر فهرست می کند:
[me@linuxbox ~]$ du -s /usr/share/* | سر
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
[me@linuxbox ~]$ du -s /usr/share/* | سر
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
در این مثال، نتایج را به داخل لوله می کنیم سر برای محدود کردن نتایج به ده خط اول. ما می توانیم یک لیست مرتب شده عددی برای نشان دادن ده مصرف کننده بزرگ فضا به این ترتیب ایجاد کنیم:
[me@linuxbox ~]$ du -s /usr/share/* | مرتب سازی -nr | سر
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dict
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
[me@linuxbox ~]$ du -s /usr/share/* | مرتب سازی -nr | سر
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dict
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
با استفاده از -شماره گزینهها، یک مرتبسازی عددی معکوس تولید میکنیم که بزرگترین مقادیر در ابتدا در نتایج ظاهر میشوند. این مرتب سازی کار می کند زیرا مقادیر عددی در ابتدای هر خط رخ می دهد. اما اگر بخواهیم لیستی را بر اساس مقداری که در داخل خط یافت می شود مرتب کنیم، چه؟ به عنوان مثال، نتایج یک ls-l:
[me@linuxbox ~]$ ls -l /usr/bin | سر
مجموع 152948
-rwxr-xr-x | 1 | ریشه | ریشه | 34824 | 2016-04-04 | 02:42 | [ |
-rwxr-xr-x | 1 | ریشه | ریشه | 101556 | 2007-11-27 | 06:08 | a2d |
-rwxr-xr-x | 1 | ریشه | ریشه | 13036 | 2016-02-27 | 08:22 | متصل کردن |
-rwxr-xr-x | 1 | ریشه | ریشه | 10552 | 2007-08-15 | 10:34 | acpi |
-rwxr-xr-x | 1 | ریشه | ریشه | 3800 | 2016-04-14 | 03:51 | acpi_fakekey |
-rwxr-xr-x | 1 | ریشه | ریشه | 7536 | 2016-04-19 | 00:19 | acpi_listen |
-rwxr-xr-x | 1 | ریشه | ریشه | 3576 | 2016-04-29 | 07:57 | اضافه کردن |
-rwxr-xr-x | 1 | ریشه | ریشه | 20808 | 2016-01-03 | 18:02 | adr2line |
-rwxr-xr-x | 1 | ریشه | ریشه | 489704 | 2016-10-09 | 17:02 | adept_batch |
فعلاً نادیده گرفتن آن ls می توانیم نتایج آن را بر اساس اندازه مرتب کنیم، می توانیم استفاده کنیم نوع برای مرتب کردن این لیست بر اساس اندازه فایل، همچنین:
[me@linuxbox ~]$ ls -l /usr/bin | مرتب سازی -nr -k 5 | سر
-rwxr-xr-x | 1 | ریشه | ریشه | 8234216 | 2016-04-07 | 17:42 | اینکاسکیپ |
-rwxr-xr-x | 1 | ریشه | ریشه | 8222692 | 2016-04-07 | 17:42 | inkview |
-rwxr-xr-x | 1 | ریشه | ریشه | 3746508 | 2016-03-07 | 23:45 | gimp-2.4 |
-rwxr-xr-x | 1 | ریشه | ریشه | 3654020 | 2016-08-26 | 16:16 | کوآنتا |
-rwxr-xr-x | 1 | ریشه | ریشه | 2928760 | 2016-09-10 | 14:31 | gdbtui |
-rwxr-xr-x | 1 | ریشه | ریشه | 2928756 | 2016-09-10 | 14:31 | gdb |
-rwxr-xr-x | 1 | ریشه | ریشه | 2602236 | 2016-10-10 | 12:56 | خالص |
-rwxr-xr-x | 1 | ریشه | ریشه | 2304684 | 2016-10-10 | 12:56 | مشتری rpcc |
-rwxr-xr-x | 1 | ریشه | ریشه | 2241832 | 2016-04-04 | 05:56 | استعداد |
-rwxr-xr-x | 1 | ریشه | ریشه | 2202476 | 2016-10-10 | 12:56 | smbcacls |
استفاده های زیادی از نوع شامل پردازش از داده های جدولی، مانند نتایج حاصل از ls دستور بالا اگر اصطلاحات پایگاه داده را در جدول بالا اعمال کنیم، می گوییم که هر ردیف یک است رکورد و اینکه هر رکورد از چندین مورد تشکیل شده است زمینهمانند ویژگی های فایل، تعداد پیوندها، نام فایل، اندازه فایل و غیره. نوع قادر به پردازش فیلدهای فردی است. در شرایط پایگاه داده، ما می توانیم یک یا چند مورد را مشخص کنیم زمینه های کلیدی به عنوان استفاده کنید کلیدهای مرتب سازی. در مثال بالا، ما را مشخص می کنیم n و r گزینه هایی برای انجام مرتب سازی عددی معکوس و مشخص کردن -k 5 را به نوع از فیلد پنجم به عنوان کلید مرتب سازی استفاده کنید.
La k گزینه بسیار جالب است و دارای ویژگی های بسیاری است، اما ابتدا باید در مورد چگونگی صحبت کنیم نوع فیلدها را تعریف می کند. بیایید یک فایل متنی بسیار ساده متشکل از یک خط واحد حاوی نام نویسنده را در نظر بگیریم:
ویلیام شاتز
ویلیام شاتز
به طور پیش فرض، نوع این خط را دارای دو فیلد می بیند. فیلد اول شامل کاراکترهای زیر است:
"ویلیام"
و فیلد دوم شامل کاراکترهای زیر است:
"شات"
به این معنی که کاراکترهای فضای خالی (فضاها و زبانه ها) به عنوان جداکننده بین فیلدها استفاده می شوند و هنگام مرتب سازی، جداکننده ها در فیلد گنجانده می شوند.
نگاهی دوباره به خطی از ما ls خروجی، می بینیم که یک خط شامل هشت فیلد است و فیلد پنجم اندازه فایل است:
-rwxr-xr-x 1 root root 8234216 2016-04-07 17:42 inkscape
-rwxr-xr-x 1 root root 8234216 2016-04-07 17:42 inkscape
برای سری بعدی آزمایشهای خود، اجازه دهید فایل زیر حاوی تاریخچه سه توزیع محبوب لینوکس منتشر شده از سال 2006 تا 2008 باشد. هر خط در فایل دارای سه قسمت است: نام توزیع، شماره نسخه و تاریخ انتشار در MM/DD. فرمت /YYYY:
سوس | 10.2 | 12/07/2006 |
کلاه نمدی مردانه | 10 | 11/25/2008 |
سوس | 11.0 | 06/19/2008 |
اوبونتو | 8.04 | 04/24/2008 |
کلاه نمدی مردانه | 8 | 11/08/2007 |
سوس | 10.3 | 10/04/2007 |
اوبونتو | 6.10 | 10/26/2006 |
کلاه نمدی مردانه | 7 | 05/31/2007 |
اوبونتو | 7.10 | 10/18/2007 |
اوبونتو | 7.04 | 04/19/2007 |
سوس | 10.1 | 05/11/2006 |
کلاه نمدی مردانه | 6 | 10/24/2006 |
کلاه نمدی مردانه | 9 | 05/13/2008 |
اوبونتو | 6.06 | 06/01/2006 |
اوبونتو | 8.10 | 10/30/2008 |
کلاه نمدی مردانه | 5 | 03/20/2006 |
استفاده از یک ویرایشگر متن (شاید نیرو)، این داده ها را وارد کرده و فایل حاصل را نامگذاری می کنیم dis-tros.txt.
در مرحله بعد، فایل را مرتب می کنیم و نتایج را مشاهده می کنیم:
[me@linuxbox | ~]$ | مرتب سازی distros.txt |
فدورا 10 | 11/25/2008 | |
فدورا 5 | 03/20/2006 | |
فدورا 6 | 10/24/2006 | |
فدورا 7 | 05/31/2007 | |
فدورا 8 | 11/08/2007 | |
فدورا 9 | 05/13/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
اوبونتو 6.06 | 06/01/2006 | |
اوبونتو 6.10 | 10/26/2006 | |
اوبونتو 7.04 | 04/19/2007 | |
اوبونتو 7.10 | 10/18/2007 | |
اوبونتو 8.04 | 04/24/2008 | |
اوبونتو 8.10 | 10/30/2008 |
خوب، بیشتر کار می کرد. مشکل در مرتبسازی شمارههای نسخه فدورا رخ میدهد. از آنجایی که "1" قبل از "5" در مجموعه کاراکترها قرار می گیرد، نسخه "10" در بالا به پایان می رسد در حالی که نسخه "9" به پایین می رسد.
برای رفع این مشکل باید چندین کلید را مرتب کنیم. می خواهیم در فیلد اول مرتب سازی الفبایی و در فیلد دوم مرتب سازی عددی انجام دهیم. نوع اجازه می دهد تا
نمونه های متعدد از -k گزینه ای به طوری که کلیدهای مرتب سازی متعدد را می توان مشخص کرد. در واقع یک کلید ممکن است شامل محدوده ای از فیلدها باشد. اگر هیچ محدوده ای مشخص نشده باشد (همانطور که در نمونه های قبلی ما وجود داشت)، نوع از کلیدی استفاده می کند که با فیلد مشخص شده شروع می شود و تا انتهای خط امتداد می یابد. در اینجا نحو برای مرتب سازی چند کلیدی ما آمده است:
[me@linuxbox | ~]$ | مرتب سازی --key=1,1 --key=2n distros.txt |
فدورا 5 | 03/20/2006 | |
فدورا 6 | 10/24/2006 | |
فدورا 7 | 05/31/2007 | |
فدورا 8 | 11/08/2007 | |
فدورا 9 | 05/13/2008 | |
فدورا 10 | 11/25/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
اوبونتو 6.06 | 06/01/2006 | |
اوبونتو 6.10 | 10/26/2006 | |
اوبونتو 7.04 | 04/19/2007 | |
اوبونتو 7.10 | 10/18/2007 | |
اوبونتو 8.04 | 04/24/2008 | |
اوبونتو 8.10 | 10/30/2008 |
اگرچه ما از فرم طولانی گزینه برای وضوح استفاده کردیم، -k 1,1 -k 2n دقیقاً معادل خواهد بود. در اولین نمونه از گزینه کلید، محدوده ای از فیلدها را برای درج در کلید اول مشخص کردیم. از آنجایی که میخواستیم مرتبسازی را فقط به اولین فیلد محدود کنیم، آن را مشخص کردیم 1,1 که به معنی "شروع از فیلد یک و پایان در میدان یک" است. در مورد دوم مشخص کردیم 2n، به این معنی که فیلد 2 کلید مرتب سازی است و مرتب سازی باید عددی باشد. یک حرف گزینه ممکن است در انتهای یک مشخص کننده کلید گنجانده شود تا نوع مرتب سازی را مشخص کند. این حروف گزینه همان گزینه های سراسری برای هستند نوع برنامه: b (جاهای خالی اول را نادیده بگیرید)، n (مرتب سازی عددی) r (مرتب سازی معکوس)، و غیره.
فیلد سوم در لیست ما حاوی تاریخ در قالب نامناسب برای مرتب سازی است. در رایانهها، تاریخها معمولاً به ترتیب YYYY-MM-DD قالببندی میشوند تا مرتبسازی زمانی آسان شود، اما تاریخ ما در قالب آمریکایی MM/DD/YYYY است. چگونه می توانیم این لیست را به ترتیب زمانی مرتب کنیم؟
خوشبختانه، نوع راهی فراهم می کند. گزینه کلید اجازه می دهد تا مشخصات جبران در داخل فیلدها، بنابراین می توانیم کلیدها را در فیلدها تعریف کنیم:
[me@linuxbox ~]$ مرتب سازی -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
فدورا 10 11/25/2008
اوبونتو 8.10 10/30/2008
[me@linuxbox ~]$ مرتب سازی -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
فدورا 10 11/25/2008
اوبونتو 8.10 10/30/2008
سوس | 11.0 | 06/19/2008 |
کلاه نمدی مردانه | 9 | 05/13/2008 |
اوبونتو | 8.04 | 04/24/2008 |
کلاه نمدی مردانه | 8 | 11/08/2007 |
اوبونتو | 7.10 | 10/18/2007 |
سوس | 10.3 | 10/04/2007 |
کلاه نمدی مردانه | 7 | 05/31/2007 |
اوبونتو | 7.04 | 04/19/2007 |
سوس | 10.2 | 12/07/2006 |
اوبونتو | 6.10 | 10/26/2006 |
کلاه نمدی مردانه | 6 | 10/24/2006 |
اوبونتو | 6.06 | 06/01/2006 |
سوس | 10.1 | 05/11/2006 |
کلاه نمدی مردانه | 5 | 03/20/2006 |
با مشخص کردن -k 3.7 ما دستور می دهیم نوع برای استفاده از کلید مرتب سازی که با نویسه هفتم در فیلد سوم شروع می شود، که مربوط به شروع سال است. به همین ترتیب مشخص می کنیم -k 3.1 و -k 3.4 برای جداسازی بخش های ماه و روز تاریخ. ما نیز اضافه می کنیم n و r گزینه هایی برای دستیابی به مرتب سازی عددی معکوس در b گزینه ای برای سرکوب فاصله های پیشرو (که اعداد آنها از خطی به خط دیگر متفاوت است و در نتیجه بر نتیجه مرتب سازی تأثیر می گذارد) در فیلد تاریخ گنجانده شده است.
برخی از فایل ها از برگه ها و فاصله ها به عنوان جداکننده فیلد استفاده نمی کنند. به عنوان مثال / etc / passwd
فایل:
[me@linuxbox ~]$ head /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
[me@linuxbox ~]$ head /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
فیلدهای این فایل با دو نقطه (:) پس چگونه این فایل را با استفاده از یک فیلد کلید مرتب کنیم؟ نوع فراهم می کند -t گزینه ای برای تعریف کاراکتر جداکننده فیلد. برای مرتب کردن passwd فایل در فیلد هفتم (پوسته پیش فرض حساب)، می توانیم این کار را انجام دهیم:
[me@linuxbox ~]$ مرتب کردن -t ':' -k 7 /etc/passwd | سر
من:x:1001:1001: خودم،،،:/home/me:/bin/bash
[me@linuxbox ~]$ مرتب کردن -t ':' -k 7 /etc/passwd | سر
من:x:1001:1001: خودم،،،:/home/me:/bin/bash
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:کاربر سیستم HPLIP,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/fase messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false pulse:x:107:116:PulseAudio Daemon,,,:/var/run/pulse:/bin/false
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:کاربر سیستم HPLIP,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/fase messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false pulse:x:107:116:PulseAudio Daemon,,,:/var/run/pulse:/bin/false
با تعیین کاراکتر کولون به عنوان جداکننده فیلد، می توانیم در فیلد هفتم مرتب سازی کنیم.