Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: PowerShell - sortovanie

Aktivity (2)
Avatar
Patrik Živčák:14. srpna 10:33

Mam vytvorene nasledovne na podobne csv subory. V dvoch csv suboroch, ale potrebujem triedit podla popisu v "Čeho se snažíš dosáhnout?".

$getFile = Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | Where-Object "IP_adresa" -match "10.14*"  | Sort-Object -Property MAC -Unique  | ConvertTo-Csv -NoTypeInformation | % {$_.Replace('"','')}

Zkusil jsem: Hladat na nete ale nieco take konrektne som nenasiel

Chci docílit: Chcem aby som mohol sortovat podla isteho vzoru. Mam csv kde su udaje medzi inymi aj MAC a IP adresy napr. jedna MAC adresa 2x nasledovne:

MAC: 00-1B-78-15-FE-58
IP adresa: 10.3.128.57

MAC: 00-1B-78-15-FE-58
IP adresa: 10.14.6.24

Ako vidime ip adresy sa lisia ale MAC adresy su rovnake a ja potrebujem aby vzdy vysortovalo tu MAC adresu kde je IP adresa 10.14*

Editováno 14. srpna 10:35
 
Odpovědět
14. srpna 10:33
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:14. srpna 15:43
  • otevrit csv
  • prevest na pole
  • vlastni sortCompare (a,b) {if (a[5]==b[5]) return 0; if (a[5]>b[5]) return +1; return -1}, porovnava sloupec sislo 5
  • sort(pole, sortCompare)

Takhle to umi treba javascript, tvuj jazyk, netusim.
https://webapp.fpf.slu.cz/…as3-view.htm

Editováno 14. srpna 15:45
 
Nahoru Odpovědět
14. srpna 15:43
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:14. srpna 20:40

to co tam pouzivas, je hvezdickova konvence pouzivana v cmd v prikazu dir apod.

operator -match pouziva regularni vyrazy

Where-Object { $_.IP_adresa.TrimStart() -match "^10\.14\..*"}

^ je zacatek retezce
\. je tecka ( . je libovolny znak)
.* je libovolny znak libovolnekrat (vcetne prazdneho retezce)

a ten TrimStart() je metoda z C# (ano v Powershellu lze pouzivat metody C# :-) ), ktera orizne bile znaky na zacatku retezce

cesky clanek o operatoru -match v Powershellu:
https://blogs.technet.microsoft.com/…shell-st-20/

 
Nahoru Odpovědět
14. srpna 20:40
Avatar
Odpovídá na Jirka Jr
Patrik Živčák:21. srpna 9:24

ahoj nevedel by si poradit mam taky problem mam csv vlastne to suvisi s typ predtym. V Headers pod MAC mam MAC adresy pre tlačiarne akurat niektore tlačiarne maju dve MAC oddelene čiarkou a ja potrebujem oddelit len tu prvu alebo inac len prvych 17 znakov a ta druha MAC nieje podstatna musi to byt pre cely stlpec respektive všetky bunky pod stlpcom MAC. Ukažka je v obrazku (2. v poradi). Viem, že ked orežem tie bunky toho stlpca na prvych 17 znakov musi to ist len neviem ako.

$getFile = Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | Sort-Object -Property MAC, IP_adresa | Group-Object MAC | ForEach {$_.Group | Select-Object -First 1 }  | ConvertTo-Csv -NoTypeInformation | % {$_.Replace('"','')} | Select-Object -SkipLast 1

Ono to ide len mi potom spravi to co je ukazane v obrazku (1. v poradi). Teda Mam tam MAC a druha MAC je na mieste kde ma byt IP a cely ten riadok je posunuty.

Prosim o radu ako to vyselektovat. Najlepsie by bolo najskor ten MAC stlpec osekat na 17 znakov a potom spravit to co mam v tom kode.

Editováno 21. srpna 9:26
 
Nahoru Odpovědět
21. srpna 9:24
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:21. srpna 18:51

treba takto pomoci dotnet metody substring? (je to jen vyrez. je to treba doplnit do tveho megaonelineru)

ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | %{ $_.MAC = $_.MAC.TrimStart().Substring(0,17); $_ }

nebo takto pomoci select-object a calculated property? (opet jen nastrel ... je treba zapracovat do tveho kodu)

ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | select-object Tiskarna, Model, @{label="MAC";expression={($_.MAC -split ',')[0]}}, IP_adresa, ID_terminalu

P.S.: pokud ti neco ode me v tomhle diskuznim vlaknu pomohlo ci pomuze, tak urcite nepohrdnu akceptovanym resenim ;-)

 
Nahoru Odpovědět
21. srpna 18:51
Avatar
Odpovídá na Jirka Jr
Patrik Živčák:21. srpna 19:56

ak sa možem opytat mna ako prve napadol substring ešte som to neskusil ale skusim zajtra.
K tvojmu kodu čo znamena v druhom rieešeni nakonci: [0] Viem, 6e split() rozdeli retazec na pole podretazcov podla nejakeho seperatora tak to bolo v .NET kurze.
Ja som to riešil 2 dni skušal som priklad samozrejme to nešlo:

$getFile = (Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header 'Tiskarna','Model','MAC','IP_adresa','ID_terminalu') |
           select Tiskarna, Model, @{Name="MAC".Substring(0,17);Expression={$_."MAC"}}

Potom aj ine niečo na štyl možnosti napr ale tiež mimo.

$getFile = (Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header 'Tiskarna','Model','MAC','IP_adresa','ID_terminalu') | foreach-object MAC | % {$_.Substring(0,16)}

A plno inych možnosti som skušal niektore s ich boli skladbou prikazov tak na 90% rovnake ako tie dve tvoje a lišili sa len v drobnostiach.

Odkiaľ vieš v akom tvare všeobecne som sa pohyboval velmi blizko oboch tych riešeni čo si napisal ale proste nikdy to nešlo.
Napr. aky je rozdiel medzi:

.... |  foreach-object MAC |  {$_.xxx}

a

.... |  foreach-object MAC | %  {$_.xxx}

Aky je rozdiel ked das % a čo vlastne znamena $_. percento viem, že to niekde použivaju a nieekdy to funguje inokedy nie
Niekde som videl dokonca v kode použil a šlo to potom pri osekani MAC mi to nešlo vobec:

.... | xxxx | %  {$_.Substring(x,x)}
Editováno 21. srpna 19:59
 
Nahoru Odpovědět
21. srpna 19:56
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:21. srpna 23:40

zacnu od druhe casti:

  1. % je to same co foreach-object .... stejne jako ? je to same co where-object (powershell ma takovych zkratek-aliasu vic a muzes si vytvaret i vlastni)
  2. {$_.xxx} je vyraz generujici jeden jediny objekt typu scriptblock
  3. %{$_.xxx} je commandlet foreach-object prijimajici objekty/radky na vstupu a na vystupu vyhazujici pouze sloupec/vlastnost xxx .... commandlet foreach-object je neco jako funkce, ktera na vstupu prijima jeden objekt za druhym, nad kazdym objektem vyhodnoti vyraz uzavreny v {} a vysledek vyhodnoceni plivne na vystup {neco jako takovy zpracovavac objektu}

krasne to uvidis, kdyz si spustis dva nasledujici kody

{neexistujici_funkce}

vs

%{neexistujici_funkce}

prvni ti vypise text skriptu/vyrazu uzavreneho ve slozenych zavorkach a dal ho neresi

druhy se pokusi zanalyzovat skript/vyraz ve slozenych zavorkach, aby ho mohl provest (nebude provadet, protoze nema nic na vstupu, ale stejne zanalyzuje a vyhodi chybu o neexistujici funkci)

4. $_ je docasna promenna, ktera znamena aktualne zpracovavany objekt ..... proste, kdyz ti dojde pres rouru do %{ } jeden objekt s celym radkem z CSVcka, tak je ten objekt ulozenej v $_ a ty v tech slozenejch zavorkach pouzijes $_, abys s tim prichozim objektem pracoval

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
21. srpna 23:40
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:21. srpna 23:47
.... | xxxx | %  {$_.Substring(x,x)}

nekde ti tohle muze fachcit, nekde ne

pokud zacatek roury ....|xxxx| plive jeden string za druhym, tak ok, na vystupu budes mit substringy tech stringu

pokud ale ....|xxxx| plive jiny typ objektu nez stringy (csv radky, objekty windowsich servis, etc), tak ti to zarve, protoze to v tech objektech nenajde metodu substring

kdyz nevis, jestli ti na vstup | % {$_.Substring(x,x)} prichazi stringy nebo neco jineho, je dobre overit si typ prichazjicich objektu

treba takto

.... | xxxx |select -first 1| %  {$_.gettype()}

to ti vytahne prvni objekt a ostatni zahodi .... a na vytazenem objektu ti to zjisti typ a vypise nazev toho typu

 
Nahoru Odpovědět
21. srpna 23:47
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:22. srpna 0:11

tak, tema vlakna se rozsiruje o dalsi a dalsi otazky a brzy by se z vlakna stal celotydenni vyukovy kurz

zkus zacit od

Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | %{ $_.MAC = $_.MAC.TrimStart().Substring(0,17); $_ }

jak jsem psal driv

pokud ti to vypise tabulku s vynechanymi sekundarnimi mac adresami, tak jsem ti v tomto vlakne vyresil uz druhy dotaz plus vysvetlil nektere aspekty jazyka Powershell a tudiz bych prosil jedno akceptovane reseni, jinak prestavam s konverzaci, jelikoz netusim, kolik jeste otazek budu muset vyresit, aby toto vlakno bylo povazovano za vyresene

az budes potrebovat resit dalsi problemy v powershellu, tak prosim dalsi, nove, vlakno a uz se tesim na dalsi spolupraci .... milovniku powershellu je tu malo a kazdy novy milovnik a vlakno potesi :-)

a na zaver tohoto prispevku jednu dobrou radu: kdyz ti nejaky dlouhy prikaz v powershellu nejede, tak si ho rozsekej podle rour a zleva zkousej, jestli kazda cast prikazu haze co ma

napr. mam prikaz, ktery vygeneruje cisla od 1 do 10 , ke kazdemu pricte jednicku a pak vynasobi vysledek dvema .... tedy na vystupu budou cisla mezi 4 a 22 vcetne

1..10 | %{$_+1} | %{$*2}

jenze prikaz nefacha a ja hned nevidim, kde je chyba

nejdriv zkusim 1..10 a je to ok - cisla od 1 do 10
pak zkusim 1..10|%{$_+1} a je to ok - cisla od 2 do 11
pak zkusim 1..10|%{$_+1}|­%{$*2} a vidim ze problem je v polsedni casti a uz vidim, ze tam misto $_ mam jen $

tenhle priklad je sice kokotina, ale kdyz tenhle postup aplikujes na nejaky ten delsi prikaz na zpracovani CSV, tak uvidis, jak ti to pomuze se vyznat v tom, kde je chyba .... aspon me to pomaha

 
Nahoru Odpovědět
22. srpna 0:11
Avatar
Patrik Živčák:22. srpna 8:41

Riešenie ide dik akurat som zle označil predpokladal som, že ich můžem označiř aj viac (chcel som 2).

%{ $_.MAC = $_.MAC.TrimStart().Substring(0,17);

Posledna otazka: $_.MAC = $_.MAC. je klasicky ekvivalent napr.
$a= "Hura"
$a=$a.Substrin­g(x,x)
Spravne tomu rozumiem?

 
Nahoru Odpovědět
22. srpna 8:41
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:22. srpna 9:02

kazde vlakno ma jen jedno akceptovane reseni, pokud vim, ale to uz neres :-)

k te otazce. odpoved by mela byt ano, jestli jsem te spravne pochopil. ale pro jistotu vysvetlim

$_.MAC = $_.MAC.TrimStart().Substring(0,17)

= je prirazeni a to se vyhodnocuje zprava doleva jako ve vetsine jinych jazyku
tj. nejdriv se otrimuje a substringuje $_.MAC a tim vznikne 17-timistny retezec v mezipameti
jako druhy krok se vezme ten retezec z mezipameti a priradi zpet do $_.MAC

a na zaver maly bonus .... pekne video, ktere vysvetluje pouzivani $_
https://www.youtube.com/watch?…

 
Nahoru Odpovědět
22. srpna 9:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.