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í
×
dnes 15:00 | Nová verze

Byla vydána nová stabilní verze 3.1 (3.1.0) svobodného multiplatformního softwaru pro editování a nahrávání zvukových souborů Audacity (Wikipedie). Přehled nových vlastností ve videu na YouTube a v aktualizované dokumentaci.

Ladislav Hagara | Komentářů: 0
dnes 12:00 | IT novinky

V listopadu 2015 bylo představeno pětidolarové Raspberry Pi Zero. V únoru 2017 desetidolarové Raspberry Pi Zero W s Wi-Fi a Bluetooth. Dnes bylo představeno vylepšené patnáctidolarové Raspberry Pi Zero 2 W.

Ladislav Hagara | Komentářů: 0
dnes 01:11 | Nová verze

Realtimová strategie Warzone 2100 (Wikipedie) byla vydána ve verzi 4.2.0. Podrobný přehled novinek, změn a oprav v ChangeLogu na GitHubu. Nejnovější verzi Warzone 2100 lze instalovat také ze Snapcraftu. Brzy i z Flathubu.

Ladislav Hagara | Komentářů: 0
včera 22:44 | Nová verze

X Server (xorg-server) 21.1.0 byl oficiálně vydán. Mezi stěžejními novinkami je jmenována podpora např. proměnlivé obnovovací frekvence v modesetting, 2D akcelerace GLAMOR v Xvfb, gest touchpadu v XInput 2.4 nebo dokončení přechodu z Autotools na Meson. XWayland byl již dříve vydán samostatně.

Fluttershy, yay! | Komentářů: 10
26.10. 23:33 | IT novinky

Vývojáři komunikátoru Element, dříve Riot, představili Element One. Za 5 dolarů měsíčně propojí Matrix, WhatsApp, Signal a Telegram.

Ladislav Hagara | Komentářů: 24
26.10. 22:11 | Nová verze

Na konferenci Next.js Conf bylo oznámeno vydání nové verze 12 open source frameworku Next.js (Wikipedie) pro psaní webových aplikací v Reactu. Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 4
26.10. 14:22 | Zajímavý software

Vývojáři open source emulátoru přenosné herní konzole Nintendo Switch Yuzu (Wikipedie) na svém blogu informují, že v nejnovějších sestaveních Yuzu je již k dispozici nejžádanější funkce Resolution Scaler aneb hry navržené pro rozlišení 720p/900p/1080p lze hrát v rozlišení 2K/4K/8K.

Ladislav Hagara | Komentářů: 2
26.10. 13:33 | Komunita

Nadace Raspberry Pi informuje, že ovladač V3DV pro Raspberry Pi 4 úspěšně prošel testy kompatibility s Vulkan 1.1 u Khronosu.

Ladislav Hagara | Komentářů: 0
26.10. 07:00 | Zajímavý projekt

PiBox je NAS postavený na Raspberry Pi Compute Module 4. Na Kickstarteru byla spuštěna kampaň na jeho podporu.

Ladislav Hagara | Komentářů: 21
25.10. 12:44 | Nová verze

Byla vydána třetí opravná verze 19.3 v únoru vydané verze 19.0 multimediálního centra Kodi (dříve XBMC, Wikipedie) s kódovým označením Matrix.

Ladislav Hagara | Komentářů: 6
Kolik monitorů (obrazovek) používáte současně?
 (48%)
 (37%)
 (14%)
 (1%)
Celkem 469 hlasů
 Komentářů: 29, poslední 19.10. 07:04
Rozcestník



Dotaz: Jak naplnit pole vybranými řádky ze souboru

3.10. 18:06 začátečník
Jak naplnit pole vybranými řádky ze souboru
Přečteno: 367×
Dobrý den, v BASH mám pole A které obsahuje pouze čísla. Dále mám soubor B který obsahuje text. Jak můžu naplnit další pole C řádky z toho souboru B? Číslo řádku které chci získat jsou v tom poli A. Děkuji za pomoc či radu.

Odpovědi

Gréta avatar 3.10. 19:12 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

takle by jako moch bejt ten domácák?? :O :O :D ;D

#!/usr/bin/env bash

# víc líp si pomenujem první&druhej argument skriptu 
soubor_s_cisli_radku=$1
soubor_s_radky=$2

# načtem si z toho tvýho souboru s řádkama seřazený hodnoty do pole
readarray -t cisla_radku < <(sort -h $soubor_s_cisli_radku)

# pomocná proměná co bude držet číslo řádku na kterým jakoby právě budem
i=0

# while loopem budem číst řádek za řádkem ze souboru $soubor_s_radky
while IFS= read -r radek; do

  #zvednem pomocnou promenou o jedna vejš
  ((i++))
  
  # jestli je pomocná proměná rovna prvnímu elementu pole $cisla_radku .....
  if [[ $i == ${cisla_radku[0]} ]]; then
  
  # ....tak ten řádek vypišem ven...........
  echo $radek
  # .....a zahodíme první prvek pole $cisla_radku
  cisla_radku=("${cisla_radku[@]:1}")
  fi
done < $soubor_s_radky

a použije se to jakoby takle třeba

./skript.sh soubor_s_cisli_radku.txt soubor_ktery_prohledavame.txt
zapomeňte na lauru teďko máme matěje hele 🤪 🤪
3.10. 22:43 začátečník
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
Ahoj, domácák to opravdu není. Jinak děkuji za řešení ale nelíbí se mi. Pokud budu potřebovat načíst 3 řádky ze souboru který bude mít stovky řádků, tak budu muset porovnávat zbytečně stovky podmínek :-(
Gréta avatar 3.10. 23:03 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

ttttssss ňákej vybíravej :D :D co todleto řešení přez indexy :O :O

#!/usr/bin/env bash

soubor_s_cisli_radku=$1
soubor_s_radky=$2

readarray -t cisla_radku < <(sort -h $soubor_s_cisli_radku)
readarray -t radky < $soubor_s_radky

for i in "${cisla_radku[@]}"
do
echo ${radky[i-1]}
done

btw pokavaď jakoby potřebuješ vyzobávat jenom děsně malilinkatý množšství řádků tak by asi jako byl víc lepšejší třeba sed hele :O ;D

zapomeňte na lauru teďko máme matěje hele 🤪 🤪
Gréta avatar 3.10. 23:04 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

joa ten sort je tam teďko navíc zbytečně ten asi jako mužeš škrtnout :O :O

zapomeňte na lauru teďko máme matěje hele 🤪 🤪
Jendа avatar 4.10. 00:17 Jendа | skóre: 77 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
Za měsíc: soubor se mi celý nevejde do paměti
#define if(x) if ((x) || (rand() < RAND_MAX * 0.000001))
Gréta avatar 4.10. 21:15 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

:D :D

zapomeňte na lauru teďko máme matěje hele 🤪 🤪
4.10. 01:07 začátečník
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
Nejsem :)

readarray -t radky < $soubor_s_radky

ale načítá taky celý soubor, ne?
Gréta avatar 4.10. 21:14 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

........ale jako naposled :D :D

#!/usr/bin/env bash

# první argument sou ty čísla řádků
# se předpokládá že ty čísla řádků máš jakoby už seřazený :O :O
soubor_s_cisli_radku=$1

# druhej argument je soubor ze kterýho se vyzobávaj ty řádky
exec 3<$2
# jeto čarování s file descriptorem by jsme mohli číst ze dvou souborů 'najednou'
# https://bash.cyberciti.biz/guide/Opening_the_file_descriptors_for_reading_and_writing

# budem si pamatovat minulý zpracovaný číslo řádku by jsme si mohli 
# z rozdílu spočítat kolik řádku musíme přečíst by jsme dojeli tam co jakoby potřebujem
minuly_cislo_radku=0
while IFS= read -r cislo_radku; do

    radek=""
    for (( i = 0; i < $cislo_radku - $minuly_cislo_radku; i++ )) 
    do
        read radek <&3
    done

    # jestli máme v proměný $radek něco tak to vypišem
    # jinak vyskočíme z loopu
    if [[ -n $radek ]]; then
        echo $radek
    else
        break
    fi
    minuly_cislo_radku=$cislo_radku

done < $soubor_s_cisli_radku
zapomeňte na lauru teďko máme matěje hele 🤪 🤪
4.10. 23:46 Andrej | skóre: 49 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

Co když je v souboru prázdný řádek, který chceme vypsat a číst dál?

Gréta avatar 5.10. 12:22 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

se to předčasně vypne :D

jestli si je op jakoby jistej že má správnej počet řádků a se jako určitě nebude ptát na nějakej řádek mimo rosah tak tu podmínku muže dát dopryč a dát tam misto ní vobyč echo jenom :D ;D

...............hlavně ale jako vubec nevim jak vodsebe v bashi v read rozlišit eof a prázdnej řádek :D kdyby to ňák šlo by to bylo možný eště víc vylepšit :O :O

zapomeňte na lauru teďko máme matěje hele 🤪 🤪
Gréta avatar 5.10. 12:32 Gréta | skóre: 33 | blog: Grétin blogísek | Stockholm
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

napadlo mě todleto s návratovejma kódama ale to asi jakoby furt neni vono :O :O

#!/usr/bin/env bash

soubor_s_cisli_radku=$1
exec 3<$2

minuly_cislo_radku=0
while IFS= read -r cislo_radku; do

    radek=""
    status=""
    for (( i = 0; i < $cislo_radku - $minuly_cislo_radku; i++ )) 
    do
        read radek <&3
        status=$?
    done

    if [[ $status -eq 0 ]]; then
        echo $radek
    else
        break
    fi
    
    minuly_cislo_radku=$cislo_radku

done < $soubor_s_cisli_radku
zapomeňte na lauru teďko máme matěje hele 🤪 🤪
6.10. 09:51 MM
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
no tak si zkus ještě zaexperimentovat s parametry readarray (-s -n -O ) - viz tady nebo man bash. Pak samozřejmě bude nutné readarray volat na víckrát. Nebo - pokud můžeš použít i jiné nástroje než bash - vyzobávat konkrétní řádky třeba tím sedem jak bylo doporučováno výše.
Jendа avatar 4.10. 00:16 Jendа | skóre: 77 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
Pokud budu potřebovat načíst 3 řádky ze souboru který bude mít stovky řádků, tak budu muset porovnávat zbytečně stovky podmínek
Ale to nejde udělat líp, protože neexistuje žádný způsob jak získat ze souboru 157855. řádek - musíš soubor číst od začátku, počítat, kolikrát je tam \n, a až narazíš na 157854., tak vypsat obsah až po další \n.

Jediné co je na tom řešení z teoretického hlediska neoptimální je, že se čísla řádků zbytečně sortují (složitost NlogN), i když by stačilo je nasypat do nějaké struktury, která umí rychlý test na „množina obsahuje číslo“ (např. hashset). V praxi se ale nejspíš ukáže, že je stejně lepší to setřídit, protože hashset má sice test v O(1), ale vyžaduje kouknout na náhodné místo v paměti, zatímco ze setříděného seznamu to čteš hezky postupně.

A pak už tu jsou implementační „detaily“ - na Bash bude tohle řešení překvapivě rychlé, protože hlavní smyčka nevolá externí programy, stejně si ale myslím, že by se tyhle věci měly psát v nějakém „opravdovém“ jazyku.
#define if(x) if ((x) || (rand() < RAND_MAX * 0.000001))
4.10. 17:05 Andrej | skóre: 49 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

Pole (i obyčejná ne-asociativní) jsou v Bashi řídká (málem jako řídká stolice) a v podstatě tedy odpovídají tomu hashsetu. (Tedy, pokud implementace nepoužívá stromy, což jsem líný teď hned kontrolovat.) Tudíž bych mohl mít čísla řádků jako indexy v řídkém poli a při čtení souboru pak jenom u každého řádku zkoušet, jestli jeho číslo v řídkém poli je:

print_lines() {
  local -; set -eu
  local -r file="$1"
  local -n lines="$2"
  local -ai indexed=()
  local -i n max=0
  local line

  for n in "${lines[@]}"; do
    ((++indexed[n]))
    ((max = max < n ? n : max))
  done
  n=0
  while ((n <= max)) && IFS= read -r line; do
    ((++n))
    for ((; indexed[n]; --indexed[n])); do printf '%d: %s\n' "$n" "$line"; done
  done < "$file"
}

# Příklad:
some_lines=({99..1..-11} {99..1..-3})
print_lines /proc/cpuinfo some_lines

Třídění ovšem může přinést jistou výhodu (ne efektivní, ale svým způsobem hezkou): Řádky mezi dvěma požadovanými můžu přečíst bez koukání do hashsetu. Což vyžaduje mít čísla řádků setříděná, abych věděl, co znamená mezi dvěma. Následující příklad na první pohled explicitní třídění nemá, ale na druhý pohled už jo: Je schované ve výrazu "${!indexed[@]}". (Ve výrazu "${indexed[@]}" bez vykřičníku by bylo taky, kdyby tam byl.) Bash prochází pole (i řídká) v pořadí setříděném podle indexů.

print_lines_with_hidden_sort() {
  local -; set -eu
  local -r file="$1"
  local -n lines="$2"
  local -ai indexed=()
  local -i n=0 m
  local line

  for m in "${lines[@]}"; do ((++indexed[m])); done
  for m in "${!indexed[@]}"; do
    until ((n == m)); do IFS= read -r line && ((++n)) || break 2; done
    for ((; indexed[m]; --indexed[m])); do printf '%d: %s\n' "$n" "$line"; done
  done < "$file"
}

# Příklad:
some_lines=({99..1..-11} {99..1..-3})
print_lines_with_hidden_sort /proc/cpuinfo some_lines

Závěrečná otázka potom je, jestli náhodou k tomu třídění někde v Bashi nedochází implicitně tak či tak, i bez použití "${!indexed[@]}". (Při reprezentaci řídkého pole vyváženými stromy jednoznačně ano — pokud by Bash něco takového používal.) V takovém případě by byl druhý příklad dokonce efektivnější (no, ehm, „krát konstanta“) než první.

4.10. 17:14 Andrej | skóre: 49 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

Teď vidím, že uvedené příklady mají tu nevýhodu, že vypisují řádky setříděné podle pořadí v souboru a nikoliv v pořadí podle pole čísel řádků.

(Zadání ovšem příliš explicitně neříká, jak to má být.)

Pokud by se měly řádky vypisovat přesně v zadaném pořadí, nezbylo by než (místo přímého výpisu) ukládat vybrané řádky do dalšího pole, indexovaného hodnotami z lines, (tj. mít všechny zvolené řádky nakonec naráz v paměti) a pak to v závěru ještě jednou vzít přes lines a vypsat tak uložené řádky ve správném pořadí (plus ve správném počtu podle indexed).

4.10. 19:46 Andrej | skóre: 49 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru

s/plus ve správném počtu podle indexed/ale hovno/ (protože počet a pořadí je už jaksi automaticky v tom poli čísel řádků).

Takže konkrétně(ji) například:

print_lines_ordered() {
  local -; set -eu
  local -r file="$1"
  local -n lines="$2"
  local -ai indexed=()
  local -a text
  local -i n=0 m
  local line

  for m in "${lines[@]}"; do ((++indexed[m])); done
  for m in "${!indexed[@]}"; do
    until ((n == m)); do IFS= read -r line && ((++n)) || break 2; done
    text[m]="$line"
  done < "$file"
  for m in "${lines[@]}"; do printf '%d: %s\n' "$m" "${text[m]}"; done
}

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.