Portál AbcLinuxu, 11. května 2025 04:38

Dotaz: Problém s funkcí sort

3.11.2017 17:00 matěj
Problém s funkcí sort
Přečteno: 755×
Odpovědět | Admin
Ahoj chlapi, proč nemůžu setřídít položky v poli? Oba dva příkazy vyplivnou zcela stejný výsledek?
for arr in "${ARR[@]}"; do echo $arr; done | sort
for arr in "${ARR[@]}"; do echo $arr; done
Chybí tam něco? Nějaké nápady? Zkoušel jsem to i takto, no výsledek je nefunkční.
ARR=($(sort "${ARR[@]}"))

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.11.2017 17:53 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Problém s funkcí sort
Odpovědět | | Sbalit | Link | Blokovat | Admin

Asi by to chtělo blíž popsat, co přesně je v tom poli ARR. Mně třeba tohle funguje a třídí/netřídí, přesně jak bych čekal:

ARR=(c b a)
for arr in "${ARR[@]}"; do echo "$arr"; done | sort
for arr in "${ARR[@]}"; do echo "$arr"; done

Takže odhaduju, že problém s tříděním se může týkat buď (a) něčeho neobvyklého, co máš v poli ARR, nebo (b) nastavení locale, které způsobuje překvapivé pořadí při třídění.

3.11.2017 17:57 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Problém s funkcí sort

Jo a to druhé, co uvádíš, mi taky funguje (když tedy správě ošetřím, že sort potřebuje mít na vstupu oddělovače řádků):

ARR=(c b a)
echo "Před tříděním: ${ARR[*]}"
ARR=($(for arr in "${ARR[@]}"; do echo "$arr"; done | sort))
echo "Po třídění: ${ARR[*]}"
3.11.2017 18:35 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Problém s funkcí sort
Ještě jedna technická, jen tak pro úplnost, aby to někde na těch Internetech bylo: Co dělat, když jsou v tom poli mezery? Třeba tohle:
ARR=('c d' 'b c' 'a b')

echo 'Před tříděním:'
for idx in "${!ARR[@]}"; do echo "${idx}: ${ARR[idx]}"; done

readarray -t ARR < <(for arr in "${ARR[@]}"; do echo "$arr"; done | sort)

echo 'Po třídění:'
for idx in "${!ARR[@]}"; do echo "${idx}: ${ARR[idx]}"; done
4.11.2017 17:08 gll
Rozbalit Rozbalit vše Re: Problém s funkcí sort
printf '%s\n' "${ARR[@]}"
printf '%s\n' "${ARR[@]}" | sort
5.11.2017 04:40 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Problém s funkcí sort

Jo, to je mnohem lepší! Toho jsem si doteď nikdy nevšiml, že printf v Bashi interpretuje formátovací řetězec znova od začátku, když najde další argumenty.

7.11.2017 12:13 matěj
Rozbalit Rozbalit vše Re: Problém s funkcí sort
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ono to třídí nějak divně, je tam potřeba dát i nějaký parametr?
ARR=(c b a 9 8 7 6 5 4 1 2 10 100 200)
echo "Před tříděním: ${ARR[*]}"
ARR=($(for arr in "${ARR[@]}"; do echo "$arr"; done | sort))
echo "Po třídění: ${ARR[*]}"
Před tříděním: c b a 9 8 7 6 5 4 1 2 10 100 200
Po třídění: 1 10 100 2 200 4 5 6 7 8 9 a b c
Řešení 1× (Vladimír Čunát)
7.11.2017 12:21 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Problém s funkcí sort
sort -n
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.