OnWorks Linux ו-Windows Online WorkStations

לוגו

אירוח מקוון בחינם עבור תחנות עבודה

<הקודם | תוכן | הבא>

sort

השמיים sort התוכנית ממיינת את התוכן של קלט סטנדרטי, או קובץ אחד או יותר המצוין בשורת הפקודה, ושולחת את התוצאות לפלט סטנדרטי. תוך שימוש באותה טכניקה שבה השתמשנו חתול, אנו יכולים להדגים עיבוד של קלט סטנדרטי ישירות מהמקלדת:



[me@linuxbox ~]$ מיון > foo.txt

cba

[me@linuxbox ~]$ cat foo.txt

abc

[me@linuxbox ~]$ מיון > foo.txt

cba

[me@linuxbox ~]$ cat foo.txt

abc


לאחר הזנת הפקודה, נקליד את האותיות "c", "b" ו-"a", ואחריהן שוב Ctrl-d כדי לציין את סוף הקובץ. לאחר מכן אנו רואים את הקובץ שהתקבל ורואים שהשורות מופיעות כעת בסדר ממוין.

השאלה היא איך? sort יכול לקבל קבצים מרובים בשורת הפקודה כארגומנטים, זה אפשרי למזג מספר קבצים לכדי שלם ממוין אחד. לדוגמה, אם היו לנו שלושה קבצי טקסט ורצינו לשלב אותם לקובץ אחד ממוין, נוכל לעשות משהו כמו זה:



מיון file1.txt file2.txt file3.txt > final_sorted_list.txt

מיון file1.txt file2.txt file3.txt > final_sorted_list.txt


ל- sort יש כמה אפשרויות מעניינות. הנה רשימה חלקית:


טבלה 20-1: אפשרויות מיון נפוצות


אפשרות

אופציה ארוכה

תיאור

-b

--התעלם מהחסרים-מובילים

כברירת מחדל, המיון מתבצע על

כל הקו, החל מה-

הדמות הראשונה בשורה. זֶה

האפשרות גורמת להתעלמות ממיון

מובילים חללים בקווים ו

מחשבת מיון על סמך הראשון

תו ללא רווח לבן ב-

קו.

-f

--התעלם ממקרה

הופך את המיון לבלתי רגיש לאותיות גדולות.


-n

--מיון מספרי

מבצע מיון על סמך הערכה מספרית של מחרוזת. שימוש באפשרות זו מאפשר לבצע מיון על ערכים מספריים ולא על ערכים אלפביתיים.

-r

--לַהֲפוֹך

מיון בסדר הפוך. התוצאות נמצאות

יורד ולא עולה

סדר.

-k

--key=fieldXNXX[,fieldXNXX]

מיון על סמך שדה מפתח שנמצא

החל מ- fieldXNXX ל fieldXNXX ולא

כל הקו. ראה דיון למטה.

-m

--לְמַזֵג

התייחס לכל טיעון כשם

של קובץ ממוין מראש. מיזוג מרובים

קבצים לתוצאה ממוינת אחת

מבלי לבצע פעולות נוספות

מִיוּן.

-o

--פלט=פילה

שלח פלט ממוין אל פילה במקום

מאשר פלט סטנדרטי.

-t

--שדה-מפריד=char

הגדר את מפריד השדות

אופי. כברירת מחדל שדות הם

מופרדים על ידי רווחים או טאבים.


למרות שרוב האפשרויות לעיל הן די מובנות מאליהן, חלקן אינן. ראשית, בואו נסתכל על -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/* | sort -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/* | sort -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


באמצעות -מספר אפשרויות, אנו מייצרים מיון מספרי הפוך, כאשר הערכים הגדולים ביותר מופיעים ראשונים בתוצאות. מיון זה עובד מכיוון שהערכים המספריים מופיעים בתחילת כל שורה. אבל מה אם נרצה למיין רשימה על סמך ערך כלשהו שנמצא בתוך השורה? לדוגמה, התוצאות של an ll -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

a2p

-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_האזן

-rwxr-xr-x

1

שורש

שורש

3576

2016-04-29

07:57

addpart

-rwxr-xr-x

1

שורש

שורש

20808

2016-01-03

18:02

addr2line

-rwxr-xr-x

1

שורש

שורש

489704

2016-10-09

17:02

adept_batch


מתעלמים, לרגע, מזה ls יכול למיין את התוצאות שלו לפי גודל, נוכל להשתמש sort כדי למיין רשימה זו לפי גודל קובץ, גם כן:


תמונה

[me@linuxbox ~]$ ls -l /usr/bin | sort -nr -k 5 | רֹאשׁ


-rwxr-xr-x

1

שורש

שורש

8234216

2016-04-07

17:42

Inkscape

-rwxr-xr-x

1

שורש

שורש

8222692

2016-04-07

17:42

תצוגת דיו

-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

rpcclient

-rwxr-xr-x

1

שורש

שורש

2241832

2016-04-04

05:56

כישרון

-rwxr-xr-x

1

שורש

שורש

2202476

2016-10-10

12:56

smbcacls


שימושים רבים ב sort כרוך בעיבוד של נתונים טבלאיים, כגון התוצאות של ls הפקודה למעלה. אם נחיל מינוח של מסד נתונים על הטבלה שלמעלה, היינו אומרים שכל שורה היא a שיא ושכל רשומה מורכבת ממספר רב שדות, כגון תכונות הקובץ, ספירת קישורים, שם הקובץ, גודל הקובץ וכן הלאה. sort מסוגל לעבד שדות בודדים. במונחים של מסד נתונים, אנו יכולים לציין אחד או יותר שדות מפתח להשתמש בתור מיון מפתחות. בדוגמה לעיל, אנו מציינים את n ו r אפשרויות לביצוע מיון מספרי הפוך ולציין -ק 5 לעשות sort השתמש בשדה החמישי כמפתח למיון.

השמיים k האפשרות היא מאוד מעניינת ויש לה תכונות רבות, אבל קודם כל אנחנו צריכים לדבר על איך sort מגדיר שדות. בואו ניקח בחשבון קובץ טקסט פשוט מאוד המורכב משורה אחת המכילה את שם המחבר:



וויליאם שוטס

וויליאם שוטס


כברירת מחדל, sort רואה בקו זה שני שדות. השדה הראשון מכיל את התווים:

"וויליאם"

והשדה השני מכיל את התווים:

"זריקות"

כלומר, תווי רווח לבן (רווחים וטאבים) משמשים כמפרידים בין שדות ושהמפרידים נכללים בשדה בעת ביצוע המיון.

מסתכל שוב על שורה משלנו 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 פורמט:


SUSE

10.2

12/07/2006

פדורה

10

11/25/2008

SUSE

11.0

06/19/2008

אובונטו

8.04

04/24/2008

פדורה

8

11/08/2007

SUSE

10.3

10/04/2007

אובונטו

6.10

10/26/2006

פדורה

7

05/31/2007

אובונטו

7.10

10/18/2007

אובונטו

7.04

04/19/2007

SUSE

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


שימוש בעורך טקסט (אולי מֶרֶץ), נזין נתונים אלה ונשים שם לקובץ שנוצר distros.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" נופלת למטה.

כדי לתקן בעיה זו נצטרך למיין על מספר מפתחות. אנו רוצים לבצע מיון אלפביתי בשדה הראשון ולאחר מכן מיון מספרי בשדה השני. sort מאפשר


מקרים מרובים של -k אפשרות כך שניתן לציין מספר מפתחות מיון. למעשה, מפתח עשוי לכלול מגוון של שדות. אם לא צוין טווח (כפי שהיה בדוגמאות הקודמות שלנו), sort משתמש במפתח שמתחיל בשדה שצוין ונמשך עד סוף השורה. להלן התחביר למיון מרובה המפתחות שלנו:



[me@linuxbox

~]$

sort --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


למרות שהשתמשנו בצורה הארוכה של האפשרות לבהירות, -ק 1,1 -ק 2n יהיה שווה ערך בדיוק. במופע הראשון של אפשרות המפתח, ציינו מגוון שדות לכלול במפתח הראשון. מכיוון שרצינו להגביל את המיון לשדה הראשון בלבד, ציינו 1,1 שפירושו "התחל בשדה XNUMX וסיום בשדה XNUMX". במקרה השני, פירטנו 2n, כלומר שדה 2 הוא מפתח המיון ושהמיון צריך להיות מספרי. ניתן לכלול אות אופציה בסוף מפרט מפתח כדי לציין את סוג המיון שיש לבצע. אותיות אופציות אלו זהות לאפשרויות הגלובליות עבור sort תכנית: b (התעלם מהחסרים המובילים), n (מיון מספרי), r (מיון הפוך), וכן הלאה.

השדה השלישי ברשימה שלנו מכיל תאריך בפורמט לא נוח למיון. במחשבים, תאריכים בדרך כלל מעוצבים לפי YYYY-MM-DD כדי להקל על המיון הכרונולוגי, אבל התאריכים שלנו הם בפורמט האמריקאי של MM/DD/YYYY. כיצד נוכל למיין רשימה זו בסדר כרונולוגי?

למרבה המזל, sort מספק דרך. אפשרות המפתח מאפשרת מפרט של קיזוז בתוך שדות, כדי שנוכל להגדיר מפתחות בתוך שדות:



[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt

פדורה 10 11/25/2008

אובונטו 8.10 10/30/2008

[me@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt

פדורה 10 11/25/2008

אובונטו 8.10 10/30/2008


SUSE

11.0

06/19/2008

פדורה

9

05/13/2008

אובונטו

8.04

04/24/2008

פדורה

8

11/08/2007

אובונטו

7.10

10/18/2007

SUSE

10.3

10/04/2007

פדורה

7

05/31/2007

אובונטו

7.04

04/19/2007

SUSE

10.2

12/07/2006

אובונטו

6.10

10/26/2006

פדורה

6

10/24/2006

אובונטו

6.06

06/01/2006

SUSE

10.1

05/11/2006

פדורה

5

03/20/2006


על ידי ציון -ק 3.7 אנו מדריכים sort להשתמש במפתח מיון שמתחיל בתו השביעי בתוך השדה השלישי, המתאים לתחילת השנה. כמו כן, אנו מציינים -ק 3.1 ו -ק 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


השדות בקובץ זה מופרדים בנקודתיים (:), אז איך נמיין את הקובץ הזה באמצעות שדה מפתח? sort מספק את -t אפשרות להגדיר את תו מפריד השדות. כדי למיין את פסח קובץ בשדה השביעי (מעטפת ברירת המחדל של החשבון), נוכל לעשות זאת:


[me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | רֹאשׁ

me:x:1001:1001:עצמי,,,:/home/me:/bin/bash

[me@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | רֹאשׁ

me: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 system user,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false 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 system user,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false 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


על ידי ציון תו הנקודתיים כמפריד השדות, נוכל למיין בשדה השביעי.


מחשוב ענן מערכת ההפעלה המוביל ב-OnWorks: