Portál AbcLinuxu, 14. května 2025 01:00

Dotaz: serazeni pole v bashi

30.6.2007 16:22 Petr
serazeni pole v bashi
Přečteno: 1768×
Odpovědět | Admin
prosim vas o radu kterak seradit hodnoty v poli inkrementalne. Pole obsahuje napriklad:

#!/bin/bash

pole=( 1 10 6 9 10 22 11 34 21 12 2 )

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

Odpovědi

30.6.2007 17:15 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jde to udělat třeba takto pomocí jednoduchého třídění výměnou s časovou složitostí O(N^2):
#!/bin/bash
POLE=(4 1 8 6 10)
echo "Pole před: ${POLE[@]}"
for ((I=0;I<${#POLE[@]};I++)); do
	for ((J=I+1;J<${#POLE[@]};J++)); do
		if [ ${POLE[J]} -lt ${POLE[I]} ]; then
			TMP=${POLE[J]}
			POLE[J]=${POLE[I]}
			POLE[I]=$TMP
		fi
	done
done	
echo "Pole po: ${POLE[@]}"
David Watzke avatar 30.6.2007 18:07 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
pole=($(sed 's: :\n:g' <<< "${pole[*]}" | sort -n))
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
30.6.2007 20:10 Martin Čížek | skóre: 20 | Praha
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
IFS=$'\n'
pole=($(echo "${pole[*]}" | sort -n))
IFS=$' \t\n'
Kdyby dva z nás byli dvěma z nich, všichni z nás by mohli být všemi z nich.
David Watzke avatar 30.6.2007 20:19 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: serazeni pole v bashi
IFS=$'\n' pole=($(sort -n <<< "${pole[*]}"))
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
2.7.2007 08:38 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
$ perl -mString::Escape -le '($a = <>) =~ s/$//;print String::Escape::escape("printable", $a)' <<<"$IFS"
 \t\n
$ pole=( 1 10 6 9 10 22 11 34 21 12 2 )
$ IFS=$'\n' pole=($(sort -n <<< "${pole[*]}"))
$ perl -mString::Escape -le '($a = <>) =~ s/$//;print String::Escape::escape("printable", $a)' <<<"$IFS"
\n
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
2.7.2007 11:33 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: serazeni pole v bashi
nie je chomp ($a = <>); bezpečnejšie ?
2.7.2007 13:28 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Bohužel :-(
$ perl -mString::Escape -le '($a = <>) =~ s/$//;print String::Escape::escape("printable", $a)' <<<"$IFS"
 \t\n
$ perl -mString::Escape -le 'chomp ($a = <>);print String::Escape::escape("printable", $a)' <<<"$IFS"
 \t
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
2.7.2007 13:52 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: serazeni pole v bashi
hmm, to potom nerozumiem dôvodu, prečo tam máte ten regulárny výraz :-(
2.7.2007 13:57 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Heh, předtím mi tam lezly dvě \n za sebou a teď už to nedělá. Už nevím čí jsem.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
2.7.2007 14:01 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Teď koukám, že to úplně spraví
perl -mString::Escape=escape -le 'print escape("printable", scalar <>)' <<<"$IFS"
Dnes nemám svůj den. Pointa byla v tom, že se to IFS nevrátí do default podoby.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
David Watzke avatar 2.7.2007 14:45 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Pointa byla v tom, že se to IFS nevrátí do default podoby.
Aha, to je divný. Dík za warning.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
2.7.2007 21:55 Petr
Rozbalit Rozbalit vše Re: serazeni pole v bashi

Tohle nejde, promenna IFS zustane nastavena na \n i dal. Jde ale pouzit subshell, treba takto:

a=( $( IFS=$'\n'; echo "${a[*]}" | sort -n ) );

wolf09 avatar 2.7.2007 10:08 wolf09 | skóre: 30
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
echo 1 3 7 17 7 | tr ' ' '\n' | sort -k1n | tr '\n' ' '
Zkusili jste to vypnout a znovu zapnout ?
2.7.2007 12:16 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
V pythonu (pokud je vstupem řetězec obsahující čísla oddělená mezerou).
>>> pole="1 10 6 9 10 22 11 34 21 12 2".split()
>>> pole_int = [int(x) for x in pole]
>>> print sorted(pole_int)
[1, 2, 6, 9, 10, 10, 11, 12, 21, 22, 34]
Samozřejmě je příjemnější, když pole obsahuje rovnou čísla:
>>> pole = [1, 10, 6, 9, 10, 22, 11, 34, 21, 12, 2]
>>> pole.sort()
>>> print pole
[1, 2, 6, 9, 10, 10, 11, 12, 21, 22, 34]
2.7.2007 12:29 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: serazeni pole v bashi
google: python user defined sort
uloha: v prvom príklade nepoužiť print_int :-)
2.7.2007 13:25 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Tak to mě ani nenapadne. Akorát by vznikla zase další "plodná" diskuse ohledně lambdy, efektivity, přehlednosti, počtu řádků, zbytečného volání int(), přístupu decorate-sort-undecorate a nakonec by si nějaký dobrák vzpomněl, že to vlastně není v bashi :-)
2.7.2007 13:54 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: serazeni pole v bashi
to ja len tak, že niekde používate metódy, niekde funkcie, niekde pretypovanie :-)
2.7.2007 22:07 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: serazeni pole v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
STFW: bash array sort

1. http://tldp.org/LDP/abs/html/arrays.html v texte hľadať slovíčko bubble

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.