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 10:22 | Humor

    Connor Byrne z USA používal pro přihlašování na svůj iPhone 13 s iOS 18 heslo obsahující háček. Po aktualizaci na iOS 26.4 se už ale do telefonu nepřihlásí. Při přihlašování nelze tento háček zadat. Apple jej prostě odstranil [The Register].

    Ladislav Hagara | Komentářů: 24
    dnes 03:11 | Nová verze

    Linus Torvalds vydal jádro Linux 7.0. Podrobný výčet změn je ke zhlédnutí na stránce Kernel Newbies, stručné výběry v LWN (část první, druhá).

    |🇵🇸 | Komentářů: 2
    dnes 02:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME? Pravidelný přehled novinek v Týden v GNOME. Vypíchnout lze novou verzi 2026.1 přehrávače hudby Amberol (Flathub).

    Ladislav Hagara | Komentářů: 0
    včera 13:11 | Nová verze

    Byla vydána verze 12.0 s kódovým jménem Ecne linuxové distribuce Trisquel GNU/Linux. Založena je na Ubuntu 24.04 LTS a podporována bude do roku 2029. Trisquel patří mezi svobodné distribuce doporučované Nadací pro svobodný software (FSF).

    Ladislav Hagara | Komentářů: 0
    včera 05:33 | Nová verze

    Open-source citační manažer Zotero (Wikipedie, GitHub) byl vydán v nové major verzi 9. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    11.4. 18:33 | Komunita

    Libre Graphics Meeting 2026, tj. čtyřdenní konference a setkání vývojářů a uživatelů svobodných a otevřených grafických softwarů, proběhne od 22. do 25. dubna v Norimberku. Dění lze sledovat na Mastodonu.

    Ladislav Hagara | Komentářů: 0
    11.4. 03:11 | Zajímavý software

    Vývojář Alexandre Gomes Gaigalas na GitHubu zveřejnil c89cc.sh, parser a kompilátor jazyka C89 napsaný v pouhém jediném skriptu o přibližně 8000 řádcích čistého bashe (bez dalších externích závislostí), který generuje ELF64 binárky pro x86-64. Jedná se o velmi jednoduchý kompilátor, který nepodporuje direktivy #include a dokonce ani funkci printf (lze použít puts), všechny dostupné deklarace lze nalézt v proměnné _BUILTIN_LIBC na konci skriptu. Skript je volně dostupný pod ISC licencí.

    » FIDESZ🧡! « | Komentářů: 10
    10.4. 23:33 | Nasazení Linuxu

    Francouzská vláda oznámila, že v rámci strategie 'digitální suverenity' zahájí 'přechod od systému Windows k počítačům s operačním systémem Linux' (sa sortie de Windows au profit de postes sous système d'exploitation Linux). DINUM (meziresortní ředitelství pro digitální technologie) požádalo ministerstva, aby do podzimu 2026 vypracovaly konkrétní plány nasazení Linuxu. Francie již dříve migrovala části státní správy na otevřená řešení.

    » FIDESZ🧡! « | Komentářů: 43
    10.4. 05:22 | IT novinky

    Nezisková organizace Electronic Frontier Foundation (EFF) hájící občanské svobody v digitálním světě po téměř 20 letech opouští platformu X (dříve Twitter). Na platformách Bluesky, Mastodon, LinkedIn, Instagram, TikTok, Facebook, Threads a YouTube zůstává.

    Ladislav Hagara | Komentářů: 6
    10.4. 03:33 | Nová verze

    Terminálový textový editor GNU nano byl vydán ve verzi 9.0. Vylepšuje chování horizontálního posouvání pohledu na dlouhé řádky a chování některých klávesových zkratek. Více v seznamu změn.

    |🇵🇸 | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (24%)
    Celkem 1296 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

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

    3.10.2021 18:06 začátečník
    Jak naplnit pole vybranými řádky ze souboru
    Přečteno: 522×
    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

    » FIDESZ🧡! « avatar 3.10.2021 19:12 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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
    3.10.2021 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 :-(
    » FIDESZ🧡! « avatar 3.10.2021 23:03 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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

    » FIDESZ🧡! « avatar 3.10.2021 23:04 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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

    Jendа avatar 4.10.2021 00:17 Jendа | skóre: 78 | 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
    » FIDESZ🧡! « avatar 4.10.2021 21:15 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak naplnit pole vybranými řádky ze souboru
    4.10.2021 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?
    » FIDESZ🧡! « avatar 4.10.2021 21:14 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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
    
    4.10.2021 23:46 Andrej | skóre: 51 | 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?

    » FIDESZ🧡! « avatar 5.10.2021 12:22 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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

    » FIDESZ🧡! « avatar 5.10.2021 12:32 » FIDESZ🧡! « | skóre: 42 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    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
    
    6.10.2021 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.2021 00:16 Jendа | skóre: 78 | 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.
    4.10.2021 17:05 Andrej | skóre: 51 | 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.2021 17:14 Andrej | skóre: 51 | 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.2021 19:46 Andrej | skóre: 51 | 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.