AWK - sort array

M Z

AWK - sort array
« kdy: 10. 06. 2022, 08:35:15 »
Zdravim,
da se v awk seradit pole podle hodnot, tak abych zaroven neprisel o klice?

du -smx /home/* | awk '{a[$2]=$1} END {for(k in a) print a[k],k | "sort -g" }'

Potreboval bych se zbavit toho "sort -g", abych dostal stejny vystup z awk bez spousteni externich prikazu.
Diky.


Re:AWK - sort array
« Odpověď #1 kdy: 10. 06. 2022, 09:01:22 »
v gawk je asorti nebo možnost traversovat podle seřazených hodnot (PROCINFO["sorted_in"] = "@val_num_asc").


To co jsi udělal je v holém awk asi nejlepší, osobně bych ale to awk úplně vyřadil, je tam zbytečné a použil rovnou sort:

Kód: [Vybrat]
du -smx /home/* | sort -k1 -n

M Z

Re:AWK - sort array
« Odpověď #2 kdy: 10. 06. 2022, 09:31:31 »
OK, tohle bylo jen pro priklad. Potrebuji udelat sort pole ktere ma stovky milionu zaznamu, takze spousteni cehokoliv externiho je problem.  S funkcemi asort a asorti jsem to zkousel, ale prislo mi, ze to proste nejde. Funkce asort seradi pole podle hodnot, ale smaze klice, zatimco asorti seradi pole podle klicu, ale zase pro jistotu zase smaze hodnoty. Takze muzu seradit pole podle klicu a fintou s puvodnim polem k nim vypsat hodnoty:

du -smx /home/* | awk '{a[$2]=$1; n=asorti(a,b)} END {for(i=1; i<=n; i++) print b,a[b]}'

ale obracene to proste nejde.

Re:AWK - sort array
« Odpověď #3 kdy: 10. 06. 2022, 10:49:39 »
tak pokud máš k dispozi gawk, kód bude vypadat takhle:

Kód: [Vybrat]
du -smx /home/* | awk 'BEGIN { PROCINFO["sorted_in"] = "@ind_num_asc" } { d[$1][$2] } END { for (val in d) { for (dir in d[val]) { print val, dir } } }'

Trik je v tom, že si vytvoříš multimienzionální pole {hodnota, složka}, to pak můžeš podle hodnoty seřadit a vypsat všechny složky se stejnou hodnotou, k tomu se právě ve starší verzi gawk dá použít ten asorti, proto jsem ho zmiňoval, přes @ind_num_asc to je ale jednodušší a rychlejší.

Efektivita ale i tak nebude velká, pokud je záznamů opravdu hodně, použil bych na to asi python, kdy do cca miliardy záznamů jeho sorted() a hashmapa umí být rychlejší než awk.
« Poslední změna: 10. 06. 2022, 10:52:03 od _Tomáš_ »

M Z

Re:AWK - sort array
« Odpověď #4 kdy: 10. 06. 2022, 11:50:36 »
Diky, tohle si ulozim do poznamek a moji ulohu prepisu do Pythonu.


Re:AWK - sort array
« Odpověď #5 kdy: 11. 06. 2022, 16:22:10 »
OK, tohle bylo jen pro priklad. Potrebuji udelat sort pole ktere ma stovky milionu zaznamu, takze spousteni cehokoliv externiho je problem.

potom je prave lepsi pouzit externi trideni (sort), nenacitat to cele do pameti, nevytvaret tak velka asociativni pole v AWK