OnWorks Linux i Windows Online WorkStation

Menu
logo

Darmowy hosting online dla stacji roboczych

<Poprzedni | Spis treści | Następne>

rodzaj

Kurs rodzaj program sortuje zawartość standardowego wejścia lub jednego lub więcej plików określonych w wierszu poleceń i wysyła wyniki na standardowe wyjście. Używając tej samej techniki, której używaliśmy jak, możemy zademonstrować przetwarzanie standardowego wejścia bezpośrednio z klawiatury:



[ja@linuxbox ~]$ sortuj > foo.txt

cba

[ja@linuxbox ~]$ kot foo.txt

ABC

[ja@linuxbox ~]$ sortuj > foo.txt

cba

[ja@linuxbox ~]$ kot foo.txt

ABC


Po wpisaniu polecenia wpisujemy litery „c”, „b” i „a”, a następnie jeszcze raz Ctrl+d aby wskazać koniec pliku. Następnie przeglądamy wynikowy plik i widzimy, że linie pojawiają się teraz w posortowanej kolejności.

Ponieważ rodzaj może akceptować wiele plików w wierszu poleceń jako argumenty, jest to możliwe łączyć wiele plików w jedną posortowaną całość. Na przykład, gdybyśmy mieli trzy pliki tekstowe i chcieli połączyć je w jeden posortowany plik, moglibyśmy zrobić coś takiego:



sortuj plik1.txt plik2.txt plik3.txt > final_sorted_list.txt

sortuj plik1.txt plik2.txt plik3.txt > final_sorted_list.txt


sort ma kilka interesujących opcji. Oto częściowa lista:


Tabela 20-1: Wspólne opcje sortowania


Option

Długa opcja

Opis

-b

--ignore-wiodące-puste

Domyślnie sortowanie jest włączone

całą linię, zaczynając od

pierwszy znak w linii. Ten

opcja powoduje ignorowanie sortowania

spacje wiodące w liniach i

oblicza sortowanie na podstawie pierwszego

znak inny niż biały znak na

Linia.

-f

--ignoruj-przypadek

Sprawia, że ​​sortowanie nie uwzględnia wielkości liter.


-n

--sortowanie numeryczne

Wykonuje sortowanie na podstawie numerycznej oceny ciągu. Użycie tej opcji umożliwia sortowanie według wartości numerycznych, a nie alfabetycznych.

-r

--odwrócić

Sortuj w odwrotnej kolejności. Wyniki są

opadający, a nie rosnący

zamówienie.

-k

--klucz=pole1[,pole2]

Sortuj w oparciu o zlokalizowane pole kluczowe

od pole1 do pole2 a nie

cała linia. Zobacz dyskusję poniżej.

-m

--łączyć

Traktuj każdy argument jako nazwę

wstępnie posortowanego pliku. Połącz wiele

pliki w jeden posortowany wynik

bez wykonywania dodatkowych czynności

sortowanie.

-o

--wyjście=filet

Wyślij posortowane dane wyjściowe do filet raczej

niż standardowe wyjście.

-t

--separator-pól=zwęglać

Zdefiniuj separator pól

postać. Domyślnie pola są

oddzielone spacjami lub tabulatorami.


Chociaż większość powyższych opcji jest dość oczywista, niektóre nie. Najpierw przyjrzyjmy się -n opcja używana do sortowania numerycznego. Dzięki tej opcji możliwe jest sortowanie wartości na podstawie wartości numerycznych. Możemy to zademonstrować, sortując wyniki funkcji du polecenie w celu określenia największych użytkowników miejsca na dysku. Zwykle du polecenie wyświetla wyniki podsumowania w kolejności nazw ścieżek:



[ja@linuxbox ~]$ du -s /usr/share/* | głowa

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

[ja@linuxbox ~]$ du -s /usr/share/* | głowa

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


W tym przykładzie potokujemy wyniki do głowa aby ograniczyć wyniki do pierwszych dziesięciu linii. Możemy stworzyć posortowaną numerycznie listę dziesięciu największych konsumentów przestrzeni w ten sposób:



[ja@linuxbox ~]$ du -s /usr/share/* | sortuj -nr | głowa

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/dykt

76508 /usr/share/icons

68072 /usr/share/apps

62844 /usr/share/foomatic

[ja@linuxbox ~]$ du -s /usr/share/* | sortuj -nr | głowa

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/dykt

76508 /usr/share/icons

68072 /usr/share/apps

62844 /usr/share/foomatic


Przy użyciu -nr opcji, tworzymy odwrotne sortowanie numeryczne, w którym największe wartości pojawiają się jako pierwsze w wynikach. Sortowanie to działa, ponieważ wartości liczbowe występują na początku każdego wiersza. Ale co, jeśli chcemy posortować listę na podstawie wartości znalezionej w wierszu? Na przykład wyniki ls -l:


obraz

[ja@linuxbox ~]$ ls -l /usr/bin | głowa

Razem 152948


-rwxr-xr-x

1

korzeń

korzeń

34824

2016-04-04

02:42

[

-rwxr-xr-x

1

korzeń

korzeń

101556

2007-11-27

06:08

2p

-rwxr-xr-x

1

korzeń

korzeń

13036

2016-02-27

08:22

połączyć

-rwxr-xr-x

1

korzeń

korzeń

10552

2007-08-15

10:34

ACPI

-rwxr-xr-x

1

korzeń

korzeń

3800

2016-04-14

03:51

acpi_fakekey

-rwxr-xr-x

1

korzeń

korzeń

7536

2016-04-19

00:19

acpi_słuchaj

-rwxr-xr-x

1

korzeń

korzeń

3576

2016-04-29

07:57

dodatek

-rwxr-xr-x

1

korzeń

korzeń

20808

2016-01-03

18:02

adres2linia

-rwxr-xr-x

1

korzeń

korzeń

489704

2016-10-09

17:02

adept_batch


Ignorując to na razie ls może posortować wyniki według rozmiaru, moglibyśmy to wykorzystać rodzaj aby posortować tę listę również według rozmiaru pliku:


obraz

[ja@linuxbox ~]$ ls -l /usr/bin | sortuj -nr -k 5 | głowa


-rwxr-xr-x

1

korzeń

korzeń

8234216

2016-04-07

17:42

inkscape

-rwxr-xr-x

1

korzeń

korzeń

8222692

2016-04-07

17:42

kałamarz

-rwxr-xr-x

1

korzeń

korzeń

3746508

2016-03-07

23:45

gimp-2.4

-rwxr-xr-x

1

korzeń

korzeń

3654020

2016-08-26

16:16

kwanty

-rwxr-xr-x

1

korzeń

korzeń

2928760

2016-09-10

14:31

gdbtui

-rwxr-xr-x

1

korzeń

korzeń

2928756

2016-09-10

14:31

gdb

-rwxr-xr-x

1

korzeń

korzeń

2602236

2016-10-10

12:56

netto


-rwxr-xr-x

1

korzeń

korzeń

2304684

2016-10-10

12:56

klient klienta

-rwxr-xr-x

1

korzeń

korzeń

2241832

2016-04-04

05:56

uzdolnienie

-rwxr-xr-x

1

korzeń

korzeń

2202476

2016-10-10

12:56

smbcacls


Wiele zastosowań rodzaj obejmować przetwarzanie dane tabelaryczne, takie jak wyniki ls polecenie powyżej. Jeśli zastosujemy terminologię dotyczącą baz danych do powyższej tabeli, powiedzielibyśmy, że każdy wiersz to a rekord i że każdy rekord składa się z wielu Pola, takie jak atrybuty pliku, liczba łączy, nazwa pliku, rozmiar pliku i tak dalej. rodzaj jest w stanie przetwarzać poszczególne pola. W kategoriach baz danych jesteśmy w stanie określić jeden lub więcej kluczowe pola używać jako klucze sortowania. W powyższym przykładzie określamy n i r opcje umożliwiające odwrotne sortowanie numeryczne i określanie -k 5 aby rodzaj użyj piątego pola jako klucza do sortowania.

Kurs k opcja jest bardzo interesująca i ma wiele funkcji, ale najpierw musimy porozmawiać o tym, jak to zrobić rodzaj definiuje pola. Rozważmy bardzo prosty plik tekstowy składający się z pojedynczej linii zawierającej nazwisko autora:



Williama Shottsa

Williama Shottsa


Domyślnie rodzaj widzi tę linię jako mającą dwa pola. Pierwsze pole zawiera znaki:

„William”

a drugie pole zawiera znaki:

„Strzały”

co oznacza, że ​​białe znaki (spacje i tabulatory) są używane jako ograniczniki między polami i że ograniczniki są uwzględniane w polu podczas sortowania.

Patrząc ponownie na linię z naszego ls na wyjściu widzimy, że linia zawiera osiem pól, a piąte pole to rozmiar pliku:



-rwxr-xr-x 1 korzeń korzeń 8234216 2016-04-07 17:42 inkscape

-rwxr-xr-x 1 korzeń korzeń 8234216 2016-04-07 17:42 inkscape


Do naszej następnej serii eksperymentów rozważmy następujący plik zawierający historię trzech popularnych dystrybucji Linuksa wydanych w latach 2006-2008. Każda linia w pliku ma trzy pola: nazwę dystrybucji, numer wersji i datę wydania w MM/DD /YYYY w formacie:


SUSE

10.2

12/07/2006

Fedora

10

11/25/2008

SUSE

11.0

06/19/2008

Ubuntu

8.04

04/24/2008

Fedora

8

11/08/2007

SUSE

10.3

10/04/2007

Ubuntu

6.10

10/26/2006

Fedora

7

05/31/2007

Ubuntu

7.10

10/18/2007

Ubuntu

7.04

04/19/2007

SUSE

10.1

05/11/2006

Fedora

6

10/24/2006

Fedora

9

05/13/2008

Ubuntu

6.06

06/01/2006

Ubuntu

8.10

10/30/2008

Fedora

5

03/20/2006


Używając edytora tekstu (być może vim), wprowadzimy te dane i nazwiemy powstały plik distros.txt.

Następnie spróbujemy posortować plik i obserwować wyniki:



[ja@linuxbox

~]$

sortuj dystrybucje.txt

Fedora 10

11/25/2008

Fedora 5

03/20/2006

Fedora 6

10/24/2006

Fedora 7

05/31/2007

Fedora 8

11/08/2007

Fedora 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

Ubuntu 6.06

06/01/2006

Ubuntu 6.10

10/26/2006

Ubuntu 7.04

04/19/2007

Ubuntu 7.10

10/18/2007

Ubuntu 8.04

04/24/2008

Ubuntu 8.10

10/30/2008


Cóż, w większości działało. Problem występuje podczas sortowania numerów wersji Fedory. Ponieważ „1” występuje przed „5” w zestawie znaków, wersja „10” kończy się na górze, a wersja „9” spada na dół.

Aby rozwiązać ten problem, będziemy musieli sortować według wielu kluczy. Chcemy wykonać sortowanie alfabetyczne w pierwszym polu, a następnie sortowanie numeryczne w drugim polu. rodzaj pozwala


wiele przypadków -k opcję, dzięki czemu można określić wiele kluczy sortowania. W rzeczywistości klucz może zawierać szereg pól. Jeśli nie określono żadnego zakresu (jak to miało miejsce w naszych poprzednich przykładach), rodzaj używa klucza rozpoczynającego się od określonego pola i kończącego się na końcu linii. Oto składnia naszego sortowania wielokluczowego:



[ja@linuxbox

~]$

sort --key=1,1 --key=2n dystrybucje.txt

Fedora 5

03/20/2006

Fedora 6

10/24/2006

Fedora 7

05/31/2007

Fedora 8

11/08/2007

Fedora 9

05/13/2008

Fedora 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

Ubuntu 6.06

06/01/2006

Ubuntu 6.10

10/26/2006

Ubuntu 7.04

04/19/2007

Ubuntu 7.10

10/18/2007

Ubuntu 8.04

04/24/2008

Ubuntu 8.10

10/30/2008


Chociaż dla przejrzystości użyliśmy długiej formy opcji, -k 1,1 -k 2n byłoby dokładnie równoważne. W pierwszej instancji opcji klucza określiliśmy zakres pól, które mają zostać uwzględnione w pierwszym kluczu. Ponieważ chcieliśmy ograniczyć sortowanie tylko do pierwszego pola, określiliśmy 1,1 co oznacza „zacznij od pierwszego pola i zakończ na pierwszym polu”. W drugim przypadku określiliśmy 2n, co oznacza, że ​​pole 2 jest kluczem sortowania i sortowanie powinno być numeryczne. Na końcu specyfikatora klucza można umieścić literę opcji, aby wskazać typ sortowania, który ma zostać wykonany. Te litery opcji są takie same, jak opcje globalne dla rodzaj program: b (zignoruj ​​początkowe spacje), n (sortowanie numeryczne), r (sortowanie odwrotne) i tak dalej.

Trzecie pole na naszym zestawieniu zawiera datę w formacie niewygodnym do sortowania. Na komputerach daty są zwykle formatowane w kolejności RRRR-MM-DD, aby ułatwić sortowanie chronologiczne, ale w naszym przypadku daty są w amerykańskim formacie MM/DD/RRRR. Jak posortować tę listę w porządku chronologicznym?

Na szczęście, rodzaj zapewnia sposób. Opcja klucza umożliwia określenie przesunięcia wewnątrz pól, dzięki czemu możemy zdefiniować klucze w obrębie pól:



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

Fedora 10 11

Ubuntu 8.10 10

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

Fedora 10 11

Ubuntu 8.10 10


SUSE

11.0

06/19/2008

Fedora

9

05/13/2008

Ubuntu

8.04

04/24/2008

Fedora

8

11/08/2007

Ubuntu

7.10

10/18/2007

SUSE

10.3

10/04/2007

Fedora

7

05/31/2007

Ubuntu

7.04

04/19/2007

SUSE

10.2

12/07/2006

Ubuntu

6.10

10/26/2006

Fedora

6

10/24/2006

Ubuntu

6.06

06/01/2006

SUSE

10.1

05/11/2006

Fedora

5

03/20/2006


Określając -k 3.7 instruujemy rodzaj użyć klucza sortowania rozpoczynającego się od siódmego znaku w trzecim polu, który odpowiada początkowi roku. Podobnie określamy -k 3.1 i -k 3.4 aby odizolować część daty zawierającą miesiąc i dzień. Dodajemy także n i r opcje umożliwiające odwrotne sortowanie numeryczne. The b dostępna jest opcja pomijania wiodących spacji (których numery różnią się w zależności od wiersza, wpływając w ten sposób na wynik sortowania) w polu daty.

W niektórych plikach nie używa się tabulatorów ani spacji jako ograniczników pól; na przykład / Etc / passwd

file:



[ja@linuxbox ~]$ głowa /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

[ja@linuxbox ~]$ głowa /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


Pola w tym pliku są oddzielone dwukropkami (:), więc jak posortować ten plik za pomocą pola klucza? rodzaj zapewnia -t możliwość zdefiniowania znaku oddzielającego pola. Aby posortować passwd plik w siódmym polu (domyślna powłoka konta), moglibyśmy to zrobić:


[ja@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | głowa

ja:x:1001:1001:Ja,,,:/home/me:/bin/bash

[ja@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | głowa

ja:x:1001:1001:Ja,,,:/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:Użytkownik systemu HPLIP,,,:/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 impuls:x:107:116:Demon PulseAudio,,,:/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:Użytkownik systemu HPLIP,,,:/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 impuls:x:107:116:Demon PulseAudio,,,:/var/run/pulse:/bin/false


Określając znak dwukropka jako separator pól, możemy sortować według siódmego pola.


Najlepsze przetwarzanie w chmurze dla systemu operacyjnego w OnWorks: