abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 2
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 2
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 8
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 22
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 4
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 771 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Bash - sort databáze v proměné typu pole

30.5.2010 22:18 Adam Výborný
Bash - sort databáze v proměné typu pole
Přečteno: 1092×
Zdravím, mám soubor reky.csv, který vypadá asi takhle:
;jmeno;delka;povodi;prutok;usti do;staty
1.;Amazonka  - Ucayali  - Apurimac;7062;6915000;219000;Atlantsky ocean;Brazilie, Peru, Bolivie, Kolumbie, Ekvador, Venezuela, Guyana
2.;Nil;6695;2870000;5100;Stredozemni more;Etiopie, Eritrea, Sudan, Uganda, Tanzanie, Kena, Rwanda, Burundi, Egypt, Demokraticka republika Kongo
3.;Jang-c-tiang;6300;1800000;31900;Vychodocinske more;CLR
4.;Mississippi - Missouri;6275;2980000;16200;Mexicky zaliv;USA (98.5%), Kanada (1.5%)
5.;Jenisej - Angara - Selenga;5539;2580000;19600;Karske more;Rusko, Mongolsko
Jde mi o to aby se taot databaze v terminalu vypasala a nabidla serazeni podle povodi, prutoku a delky (standartne je serazena podle abecedy). Vyskytli se mi vsak dva probleme. Tim prvnim je vubec design databaze, rozhodl jsem se, ze za nazev reky doplnim urcitej pocet mezer aby vsechny delky rek zacinali na stejnem miste. Zatim se mi povedlo pouze napsat for cyklus ktery zjisti kolik znaku ma nazev nejdelsi reky, nyni potrebuju nejaky cyklus ktery by zjistil pocet znaku urcite reky, odecetl tento pocet od poctu znaku nejdelsi reky a ten vysledny rozdil by byl pocet mezer, ktere by cyklus za ten nazev reky dosadil. Druhy problem je u samotneho menu a sortovani. Podarilo se mi nahazet kazdy sloupec do jedne promene typu array, co policko to jedo array pole. Nyni potrebuju nejaky menu (Pokud chcete seradit podle blabla dejte napiste jednicku, pokud podle blabla napiste dvojku...) - tudis asi read -p a IF. Nasledne vsak tu nejtezsi cast to podle toho seradit, kdyz dam sort podle povodi, potrebuju aby se pak prehazeli i ostani sloupce aby bylo u kazdeho povodi spravny nazev reky a dalsi informace. V tom by imho meli pomoc indexi polí. Nic méně nemůžu přijít jak na to. Doufám, že si s tím někdo poradí, předem děkuji za všechny rady. Zde už zmíněný skript, s postupem ke kterému, jsem se dopracoval sám:
#!/bin/bash

declare x
declare -a y
declare z
declare pozice
declare -a idecko
declare -a jmena
declare -a delka
declare -a povodi
declare -a prutok


IFS=$'\n';
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f1 -d';' ); do idecko[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f2 -d';' ); do jmena[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f3 -d';' ); do delka[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f4 -d';' ); do povodi[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f5 -d';' ); do prutok[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
y=0
z=0
for x in $( cat reky.csv | grep -v "jmeno" | cut -f2 -d';' ); do
        y[$pozice]=$x &&
        if [ $z -lt ${#y[$pozice]} ]; then
                z=${#y[$pozice]} && pozice=$((pozice + 1));
        fi
done

pozice=1
for x in $( cat reky.csv | grep -v "jmeno" );
        do echo -n -e " ${idecko[$pozice]} \t"
        ${jmena[$pozice]}
        echo "${delka[$pozice]} ${povodi[$pozice]} ${prutok[$pozice]}" && pozice=$((pozice + 1));
done

Odpovědi

30.5.2010 22:46 fraxinus | skóre: 20 | blog: fraxinus
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
ja by som to robil tak, ze podla toho podla ktoreho stlpca chce triedit by som ten stlpec skopiroval na zaciatok, napr. ak podla povodi tak z tohoto:

;jmeno;delka;povodi;prutok;usti do;staty

by vzniklo toto

povodi;jmeno;delka;povodi;prutok;usti do;staty

potom by som to jednoducho prehnal cez sort -n a potom by som vypisal vsetko okrem toho prveho stlpca ktory je duplicitny
30.5.2010 23:09 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
sort -t\; -k 3 -k 5 -k 10
30.5.2010 23:02 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
Škoda že jste to nerozdělil na víc dotazů, např. jak vytvořit řetězec mezer délky "délka X - délka nějaké proměnné" apod., takto dlouze popsané "problémy" asi moc lidí nebude bavit číst :)

cyklus ktery by zjistil pocet znaku urcite reky, odecetl tento pocet od poctu znaku nejdelsi reky a ten vysledny rozdil by byl pocet mezer

Délku řetězce zjistíte v Bashi ${#promenna}, pokud je to v poli tak ${#pole[$index]}. Takže:
mezery=""
for((i=${#promennaobsahujicijmenoreky}; $i<$delkanejdelsireky; i++)); do
  mezery=" $mezery"
done
echo "'$mezery'"
K tomu:

read -p a IF

to by šlo
read -p "Zvolte a nebo b"
case $REPLY in
  a)
    delejneco
    ;;
  b)
    delejnecojineho
    ;;
  *)
    chybnavolba
    ;;
esac
ale s ohledem na možnost překlepu by to asi chtělo do while cyklu apod, no a nebo zkuste třeba select
PS3="Vaše volba: "
select i in a b exit; do 
  [[ "$i" == "exit" ]] && break
  echo "$i"
done
Řazení podle něčeho jsem přesně nepochopil, nestačil by sort podle určitého sloupce? sort -k N
31.5.2010 00:28 Ant
Rozbalit Rozbalit vše Menu v shell scriptech
Nyni potrebuju nejaky menu (Pokud chcete seradit podle blabla dejte napiste jednicku, pokud podle blabla napiste dvojku...)
Dialog, pripadne vsechny jeho derivaty, inspirace, kopie, napodobeniny apod. (lxdialog, cdialog, Xdialog, Newt/whiptail, Zenity, ...) by mohly byt tvojimi kamarady.

screenshot a jeste jeden.

Samozrejme to muzes pokazde udelat tim nejbrutalnejsim zpusobem, jak uz ti tady radili vyse, tedy vypisovat text primo na terminal. Navod je treba tady (dalsi stranka pak dava lehounky uvod do dialogu)

Musim se take pripojit k te zadosti o mene otazek najednou a hlavne lepe formatovat. Je az z podivem, ze jsem se tim prokouskal. Takhle ti vazne moc lidi neporadi, kdyz to vypada, jako by sem jen tak ledabyle odhodil nejaky nepouceny klikaci uzivatel.

A abych nezapomnel, tak doporucim cteni Na Internet se samozrejme vali cela rada navodu, jak psat skripty v Bash.
31.5.2010 00:48 Ant
Rozbalit Rozbalit vše Cteni souboru
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f1 -d';' ); do idecko[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f1 -d';' ); do idecko[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f2 -d';' ); do jmena[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f3 -d';' ); do delka[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f4 -d';' ); do povodi[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f5 -d';' ); do prutok[$pozice]=$x && pozice=$((pozice + 1)); done
pozice=1
Oh, my eyes! :-)

Cteni ze souboru a prirazovani promennym je popsano v jednom z predchozich dotazu.

Take to pouzivani '&&' je zbytecne. Staci oddelit stredniky nebo jeste lepe psat na novy radek. Zvysovani pozicniho indexu jsem nejak nepochopil. Nemelo by tam byt: pozice=(($pozice + 1)) ?
31.5.2010 00:55 Ant
Rozbalit Rozbalit vše Re: Cteni souboru
Zvysovani pozicniho indexu jsem nejak nepochopil. Nemelo by tam byt: pozice=(($pozice + 1)) ?
Nebo pochopitelne hezci Bashova verze: ((pozice++)) (viz "man bash", sekce ARITHMETIC EVALUATION)
31.5.2010 01:54 Ant
Rozbalit Rozbalit vše Re: Cteni souboru
pozice=1
for x in $( cat reky.csv | grep -v "jmeno" | cut -f5 -d';' ); do prutok[$pozice]=$x && pozice=$((pozice + 1)); done
Aby to bylo uplne jasne, tak ta "oskliva" verze by pak vypadala:

pozice=1
for reka in $(cat reky.csv | grep -v "jmeno" | cut -f5 -d';' )
do
   prutok[$((pozice++))]=$reka
done;

Take by melo jit primo prutok[$(cat reky.csv | grep -v "jmeno" | cut -f5 -d';' )] a pak by to bylo indexovane automaticky od nuly
31.5.2010 02:02 Ant
Rozbalit Rozbalit vše Re: Cteni souboru
Take by melo jit primo prutok[$(cat reky.csv | grep -v "jmeno" | cut -f5 -d';' )]
Chybicka se vloudila.

Spravne ma byt: prutok=($(cat reky.csv | grep -v "jmeno" | cut -f5 -d';' ))
31.5.2010 01:00 Ant
Rozbalit Rozbalit vše Re: Cteni souboru
Nemelo by tam byt: pozice=(($pozice + 1)) ?
Odpovim si sam: nemelo :-)

Autor to mel spravne: pozice = $((pozice + 1))
31.5.2010 15:55 Semo | skóre: 44 | blog: Semo
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
K triedeniu: potrebujes si precitat "man sort". Ale to ti uz napisali vyssie.

Vypis retazcov na fixnu dlzku:

Najjednoduchsi sposob je
printf %10s string
printf %-10s string
Pokial vadi spustanie externeho procesu (je to napr. volane v cykle 100000x), tak cisto v Bashi (ukazane na cislach, pouzivam to v jednom skripte a nechce sa mi to prerabat):
#!/bin/bash

zeros=0000000000  # 10 nul

num=123
if [[ ${#num} -lt 10 ]]; then
    len=$((10 - ${#num}))
    num="${zeros:0:$len}$num"
fi
echo $num
If you hold a Unix shell up to your ear, you can you hear the C.
31.5.2010 18:57 Adam Výborný
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
Já vim, jak sesortuju jeden sloupecek ale je potrebuju aby se podlo toho seradili i ty dalsi...
1.6.2010 04:17 zulu
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
Nesortujes sloupce, ale radky podle nejakeho sloupce. Presne to ten sort umi.
m$ lipo $m avatar 1.6.2010 02:42 m$ lipo $m | skóre: 19 | blog: čaj o páté | Redmond
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
A je nejaky duvod proc k tomuto pouzit zrovna bash ? Reseni s bashem nebude uplne nejefektivnejsi max v nem udelat to menu. Nebylo by vhodnejsi ten csv soubor exportovat do nejake SQL db a tu pak podrobit tem dotazum co potrebujes samo ze s vypisem do konzole.
Albuquerque, New Mexico (April 4, 1975)
1.6.2010 09:19 Adam Výborný
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
Důvod je, že je to cvičební zadání od učitele
1.6.2010 10:23 chochi | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: Bash - sort databáze v proměné typu pole
Ahoj,

Ja bych to resil nejak takhle (funguje i v sh a jeste je potreba dodelat pekne formatovani):

#!/bin/sh

DB="db.csv"
OFF=10

echo "Available sort orders:"
I=1
head -1 $DB | sed "s/;/\n/g" | while read H; do
	echo "$I.) $H"
	I=`expr $I + 1`
done
MAX=`head -1 $DB | sed "s/[^;]//g" | wc -c`
SORT=""
while [ "X" = "X$SORT" ]; do
	echo
	printf "Select sort order (use value +$OFF for numeric sort): "
	read SORT
	if [ "X" = "X$SORT" ]; then
		echo "Sort order can not be empty!"
	else
		if expr $SORT + 0 1>/dev/null 2>&1; then
			NUM=""
			if [ $SORT -gt $OFF ]; then
				SORT=`expr $SORT - $OFF`
				NUM="-n"
			fi
			if [ $SORT -gt $MAX ]; then
				echo "Sort order is over maximal ($MAX) allowed value!"
				SORT=""
			fi
		else
			echo "Value \"$SORT\" is not numeric!"
			SORT=""
		fi
	fi
done
echo
tail -n +2 $DB | sort -k $SORT -t ";" $NUM

Založit nové vláknoNahoru

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

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.