• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie w batch , większej ilości liczb

Object Storage Arubacloud
+1 głos
759 wizyt
pytanie zadane 7 lutego 2021 w Inne języki przez ggreory93 Nowicjusz (190 p.)
Witam czy w batch jest możliwe posortowanie 16 zmiennych które są liczbami od najmniejszej do największej? Jak to ugryźć?

2 odpowiedzi

+1 głos
odpowiedź 7 lutego 2021 przez Wiciorny Ekspert (270,110 p.)

To jedyna operacja możliwa do wykonania na pliku jeśli chodzi o sortowanie
Polecenie Sort sortuje wiersze zapisane w pliku.

SORT [/R] [/+n] [/M KB] [/L ustawienia regionalne] [/REC bajty rekordu] [[dysk1:][ścieżka1]plik1] [/T [dysk2:][ścieżka2]] [/O [dysk3:][ścieżka3]plik3]

/+n – wskazuje numer znaku, od którego ma się rozpoczynać każde porównywanie. /+3 określa, że każde porównywanie powinno się rozpoczynać od trzeciego znaku w każdym wierszu. Wiersze krótsze niż n znaków są sortowane przed innymi wierszami. Domyślnie, porównania rozpoczynają się od pierwszego znaku każdego wiersza. /L[OCALE] - ustawienia regionalne Zastępuje domyślne ustawienia regionalne systemu określonymi ustawieniami. Ustawienie” „ C” „ daje najszybsze sortowanie i jest obecnie jedyną możliwością. W sortowaniu nigdy nie jest uwzględniana wielkość liter. /M[EMORY] KB - wskazuje ilość pamięci głównej do użycia w sortowaniu, w kilobajtach. Wielkość pamięci jest zawsze ograniczona od dołu wartością 160 KB. Jeżeli podana zostanie wielkość pamięci, w sortowaniu użyta zostanie dokładna ilość pamięci, bez względu na ilość dostępnej pamięci głównej. /REC[ORD_MAXIMUM] znaki - wskazuje maksymalną liczbę znaków w rekordzie (domyślnie 4096, maksymalnie 65535). /R[EVERSE] - Odwraca porządek sortowania, to znaczy sortuje od Z do A, następnie od 9 do 0. [dysk1:][ścieżka1]plik1 - wskazuje plik do posortowania. Jeżeli plik nie zostanie określony, użyte zostanie standardowe wejście. Określenie pliku wejściowego jest szybsze niż przekierowywanie tego samego pliku na standardowe wejście. /T[EMPORARY][dysk2:][ścieżka2] - wskazuje ścieżkę katalogu, w którym mają być zapisywane pliki robocze sortowania, w przypadku gdy dane nie zmieszczą się w pamięci głównej. Domyślnie używany jest systemowy katalog tymczasowy. /O[UTPUT] [dysk3:][ścieżka3]plik3 - wskazuje plik, w którym mają być zapisane posortowane dane wejściowe. Jeżeli plik nie zostanie określony, dane będą zapisywane do standardowego wyjścia. Wskazanie pliku wyjściowego jest szybsze niż przekierowanie standardowego wyjścia do tego samego pliku.

+1 głos
odpowiedź 8 lutego 2021 przez VBService Ekspert (253,340 p.)
edycja 9 lutego 2021 przez VBService

Demonstracja działania komendy SORT, o której wspomina @Wiciorny  wink

sort_variables.bat

@ECHO off
SETLOCAL EnableDelayedExpansion

SET a1=3
SET a2=7
SET a3=1
SET a4=9

SET cout_var=4
SET file_to_sort="to_sort.txt"
SET file_sorted="sorted.txt"

IF EXIST %file_to_sort% ( DEL %file_to_sort% /F )
IF EXIST %file_sorted% ( DEL %file_sorted% /F )

ECHO Przed sort
SET i=1
FOR /L %%I IN (1,1,%cout_var%) DO ( 
  ECHO a!i!=!a%%I!
  SET /a i+=1
)

ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL

FOR /L %%I IN (1,1,%cout_var%) DO ( ECHO !a%%I! >> %file_to_sort% )

IF EXIST %file_to_sort% ( SORT %file_to_sort% > %file_sorted% )

SET /a i=1
IF EXIST %file_sorted% (
  FOR /F %%V IN ('TYPE %file_sorted%') DO ( 
    SET /a a!i!=%%V
    SET /a i+=1
    REM ECHO %%V 
  )
)

ECHO.
ECHO Po sort
SET /a i=1
FOR /L %%I IN (1,1,%cout_var%) DO ( 
  ECHO a!i!=!a%%I!
  SET /a i+=1
)

ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL

ENDLOCAL

Sort command ]  [ SETLOCAL EnableDelayedExpansion ]

Loop through variables in cmd file ]

Load the contents of a text file into a batch variable ]

komentarz 8 lutego 2021 przez ggreory93 Nowicjusz (190 p.)
Pięknie dziękuję za pomoc , mógłby mi Pan jeszcze tylko podpowiedzieć w którym miejscu w kodzie mam zastąpić nazwę zmiennej? próbuję ale wychodzą mi cuda :) Moja nazwa zmiennej to pkt1, pkt2, pkt3, (...) pkt18. Oraz w którym miejscu w kodzie zapisać instrukcję liczącą od największej do najmniejszej? , w Pana przykładzie jest odwrotnie, przepraszam za brak wiedzy , ale dopiero uczę się składni batch.

 

pozdrawiam

Grzegorz
komentarz 9 lutego 2021 przez VBService Ekspert (253,340 p.)
edycja 9 lutego 2021 przez VBService

SORT [options]

/+n Sort the file ignoring the first one or more characters in each row. The default (/+1) will sort using all characters in each row. /+2 will start comparing at the second character, /+3 the third etc. Lines with fewer than n characters collate before other lines.

 

/R[EVERSE]  Reverse the sort order (Z to A, 9 to 0)

 

SORT /R /+2 %file_to_sort% > %file_sorted%

/+2 bo mamy liczby do posortowania od 1 do 18 (od 1-no cyfrowej do 2-u cyfrowej)  wink

 

@ECHO off
SETLOCAL EnableDelayedExpansion
 
SET pkt1=3
SET pkt2=7
SET pkt3=1
SET pkt4=9
SET pkt5=11
SET pkt6=16
SET pkt7=4
SET pkt8=8
SET pkt9=12
SET pkt10=6
SET pkt11=18
SET pkt12=2
SET pkt13=10
SET pkt14=13
SET pkt15=17
SET pkt16=14
SET pkt17=5
SET pkt18=15

REM Ile zmiennych 'pkt' - petla FOR - pkt.size() ;-) 
SET cout_var=18

SET file_to_sort="to_sort.txt"
SET file_sorted="sorted.txt"
 
IF EXIST %file_to_sort% ( DEL %file_to_sort% /F )
IF EXIST %file_sorted% ( DEL %file_sorted% /F )
 
ECHO Przed sort
SET i=1
FOR /L %%I IN (1,1,%cout_var%) DO ( 
  ECHO pkt!i!=!pkt%%I!
  SET /a i+=1
)
 
ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL
 
FOR /L %%I IN (1,1,%cout_var%) DO ( ECHO !pkt%%I! >> %file_to_sort% )
 
IF EXIST %file_to_sort% ( SORT /R /+2 %file_to_sort% > %file_sorted% )
 
SET /a i=1
IF EXIST %file_sorted% (
  FOR /F %%V IN ('TYPE %file_sorted%') DO ( 
    SET /a pkt!i!=%%V
    SET /a i+=1
    REM ECHO %%V 
  )
)
 
ECHO.
ECHO Po sort
SET /a i=1
FOR /L %%I IN (1,1,%cout_var%) DO ( 
  ECHO pkt!i!=!pkt%%I!
  SET /a i+=1
)
 
ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL
 
ENDLOCAL

 

komentarz 9 lutego 2021 przez ggreory93 Nowicjusz (190 p.)
Super i wszystko działa , ostatnie jeszcze pytanie jeśli mogę. Ogólnie jest mi to potrzebne do prostej gierki, którą sobie piszę , w późniejszym czasie posłuży mi jako podkład pod c++ po ukończeniu kursu.

 

Czy jest możliwość uporządkowania takiego kodu gdy każda ze zmiennych ma inną nazwę?

Przyjmijmy iż są to punkty zawodników. A chciałbym aby to były nazwiska zawodników, jest to możliwe? Zamiast pkt1 pkt2 itp nazwisko danego zawodnika. A wiemy , że każdy ma inne, 18 Kowalskich lub Nowaków byłoby przesadą :)
komentarz 9 lutego 2021 przez VBService Ekspert (253,340 p.)
edycja 9 lutego 2021 przez VBService

Create list or arrays in Windows Batch

Creating Structures in Arrays in batch  wink

Arrays are not specifically defined as a type in Batch Script but can be implemented.  The following things need to be noted when arrays are implemented in Batch Script.

  • Each element of the array needs to be defined with the set command.
  • The ‘for’ loop would be required to iterate through the values of the array.

players_demo-1.bat  wink

@ECHO off
REM players_demo-1.bat
SETLOCAL EnableDelayedExpansion
 
SET zawodnik[1].nazwisko=Kowalski
SET zawodnik[1].punkty=10 
SET zawodnik[2].nazwisko=Nowak 
SET zawodnik[2].punkty=5 
SET zawodnik[3].nazwisko=Mazur 
SET zawodnik[3].punkty=2 
SET zawodnik[4].nazwisko=Jankowska 
SET zawodnik[4].punkty=23 

SET zawodnik.len=4
 
FOR /L %%i IN (1 1 %zawodnik.len%) DO  (
   ECHO Nazwisko = !zawodnik[%%i].nazwisko!
   ECHO Punkty = !zawodnik[%%i].punkty!
)

ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL
 
ENDLOCAL

players_demo-2.bat

@ECHO off
REM players_demo-2.bat
SETLOCAL EnableDelayedExpansion
 
SET zawodnik[1].nazwisko=Kowalski
SET zawodnik[1].punkty=10
SET zawodnik[2].nazwisko=Nowak
SET zawodnik[2].punkty=5
SET zawodnik[3].nazwisko=Mazur
SET zawodnik[3].punkty=2
SET zawodnik[4].nazwisko=Jankowska
SET zawodnik[4].punkty=23

SET zawodnik.len=4
 
FOR /L %%i IN (1 1 %zawodnik.len%) DO  (
   ECHO Nazwisko = !zawodnik[%%i].nazwisko! [pkt. !zawodnik[%%i].punkty!]
)

ECHO.
ECHO Wcisnij dowolny klawisz ... 
PAUSE > NUL
 
ENDLOCAL

1
komentarz 10 lutego 2021 przez ggreory93 Nowicjusz (190 p.)
Wielkie podziękowania :)
komentarz 11 lutego 2021 przez VBService Ekspert (253,340 p.)

wink
players_demo-3.bat

@ECHO off
REM players_demo-3.bat

TITLE Player demo 3
REM COLOR background-color, font-color 
COLOR 06

GOTO :end_multilne_remarks

    0 = Black       8 = Gray
    1 = Blue        9 = Light Blue
    2 = Green       A = Light Green
    3 = Aqua        B = Light Aqua
    4 = Red         C = Light Red
    5 = Purple      D = Light Purple
    6 = Yellow      E = Light Yellow
    7 = White       F = Bright White

:end_multilne_remarks

SETLOCAL EnableDelayedExpansion
 
SET zawodnik[1].nazwisko= Kowalski
SET zawodnik[1].punkty=10
SET zawodnik[2].nazwisko=    Nowak
SET zawodnik[2].punkty= 5
SET zawodnik[3].nazwisko=    Mazur
SET zawodnik[3].punkty= 2
SET zawodnik[4].nazwisko=Jankowska
SET zawodnik[4].punkty=23
SET zawodnik[5].nazwisko=   Zareba
SET zawodnik[5].punkty=11
SET zawodnik[6].nazwisko= Morawska
SET zawodnik[6].punkty= 9

SET zawodnik.len=6

ECHO. 
FOR /L %%i IN (1 1 %zawodnik.len%) DO  (
   SET nazwisko=!zawodnik[%%i].nazwisko!
   SET   punkty=!zawodnik[%%i].punkty!
   ECHO  !nazwisko!  [pkt. !punkty!]
)

ECHO.
ECHO  Wcisnij dowolny klawisz ... & PAUSE > NUL
 
ENDLOCAL

komentarz 12 lutego 2021 przez ggreory93 Nowicjusz (190 p.)
Mistrzostwo dziekuje

Podobne pytania

0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 2 października 2022 w Inne języki przez pj-1024 Użytkownik (670 p.)
0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 6 sierpnia 2022 w Inne języki przez kondzix_ez Obywatel (1,910 p.)
0 głosów
2 odpowiedzi 468 wizyt

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...