abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 12:30 | IT novinky

    Seznam dělá každé úterý odstávku svého datacentra a simuluje tak správnost jejich HA řešení. Dnes se ovšem něco pokazilo a má kompletní výpadek. Nejdou webové služby, mapy apod. Kdo by rád věděl něco více o tom, na čem Seznam běží, tak nelze nepřipomenout LinuxDays 2023: Podvozek Seznamu - od cloudu až po Datacentrum (Michal Toužín, Miroslav Bezdička).

    Max | Komentářů: 4
    dnes 12:00 | Komunita

    Na stránkách konference Den IPv6 2024, jež proběhla 6. června v Praze, byly zveřejněny prezentace a videozáznamy.

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

    Kyberkriminální skupina LockBit se prý nabourala do Federálního rezervního systému (FED) [Security Affairs].

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | IT novinky

    Zakladatel WikiLeaks Julian Assange je na svobodě (𝕏, 𝕏).

    Ladislav Hagara | Komentářů: 1
    včera 13:11 | Upozornění

    V neděli 30. června skončí (EOL) podpora CentOS Linux 7.

    Ladislav Hagara | Komentářů: 11
    včera 10:44 | Zajímavý článek

    David Tschumperlé a Garry Osgood v obšírném článku se spoustou náhledů shrnují vývoj multiplatformního svobodného frameworku pro zpracování obrazu G'MIC (GREYC's Magic for Image Computing, Wikipedie) za poslední rok.

    Ladislav Hagara | Komentářů: 2
    23.6. 13:22 | IT novinky

    Andrew S. Tanenbaum byl oceněn 2023 ACM Software System Award (Wikipedie) za operační systém MINIX.

    Ladislav Hagara | Komentářů: 2
    23.6. 10:22 | Komunita

    Celkový počet stažení aplikací z Flathubu překročil 2 miliardy. Aktuální Statistiky Flathubu: Celkový počet stažení 2 002 793 783. Celkem desktopových aplikací 2 636.

    Ladislav Hagara | Komentářů: 19
    21.6. 23:33 | Nová verze

    Byla vydána nová verze 4.8.0 programu na úpravu digitálních fotografií darktable (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    21.6. 23:11 | Zajímavý článek

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 142 (pdf) a HackSpace 79 (pdf).

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    13.5. 15:47 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?

    Tohle je návod, jak to vyřešit, nikoliv řešení. Existuje na to one-liner, to je jisté; on se tu hned vynoří někdo s Perlem.

    Já bych to udělal megatěžkopádně, s pořádnými testy. Tady je totiž hned několik zajímavých situací, které je potřeba napřed přesně dodefinovat a poté správně ošetřit, například:

    • prázdné řádky na začátku a na konci vstupů,
    • několik osamocených řádků oddělených prázdnými řádky po sobě,
    • víc než jeden prázdný řádek mezi skupinami řádků, ať už dostatečně dlouhými nebo ne,
    • dostatečně a nedostatečně velké skupiny řádků jako první na začátku a konci vstupu.

    Nuže, pojďme vymyslet testovací nástroj, říkejme mu test.sh, který bude chrlit vstupy se všemi možnými podrazy. Je sice jednoduchý, ale při dostatečně velkém počtu vstupů nakonec vygeneruje všechny výše zmíněné patologické případy, protože taky umí „náhodně“ generovat bloky řádků o velikostech 0 a 1, z nichž některé skončí na začátku a konci souboru, některé možná hned po sobě atp.

    #!/bin/bash
    set -euo pipefail
    if (($# < 1)); then echo 'Expected arguments.' 1>&2; exit 11; fi
    
    print_input() {
      local -ir random="$1" blocks=10 limit=2 range='limit + 2'
      local -i j k r
      local nl=
      RANDOM=random
      for ((j = 0; j < blocks; ++j)); do
        ((r = RANDOM % range)) || :
        ((r < limit)) && line='unwanted' || line='wanted'
        printf "$nl"
        for ((k = 0; k < r; ++k)); do
          printf '%s %u/%u/%u\n' "$line" "$i" "$j" "$k"
        done
        nl=$'\n'
      done
    }
    
    RANDOM=0 || :
    declare -ir files=1000
    declare -i i random
    for ((i = 0; i < files; ++i)); do
      printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,}
      random=RANDOM
      diff -y --color <(print_input "$random") <(print_input "$random" | "$@") || :
      printf '%s%s%s%s%s%s%s%s\n' '=========='{,,,,,,,}
    done
    

    Napřed pojďme otestovat test.sh. Zkusíme tam dát kočku. Tady očekáváme výsledek bez rozdílů, tedy diff -y neukáže žádné šipky a pravá (DSSS) i levá (KSČM) strana diffů bude stejná. Tím se také potvrdí (dobře, ne tak úplně), že celý trik s pseudonáhodnými čísly a se stabilními (tedy na prostěradle zaschlými) náhodnými semeny funguje. Tedy, pravděpodobně!

    ./test.sh cat
    

    Další krok bude, že si teď místo kočky vytvoříme skutečnou implementaci toho algořiťmu. Říkejme mu třeba window.awk. Má v sobě malou optimalizaci, která hlídá, aby se nikdy nedrželo v paměti víc řádků, než je nezbytné, ale jinak je to obyčejný, tupý stavový automat:

    #!/usr/bin/awk -f
    
    function finalize_block(i) {
      if (length(block_window) >= MIN_BLOCK_LENGTH) {
        if (newline_due) print ""
        newline_due = 1
        for (i = begin; i < end; ++i) print block_window[i]
      }
      delete block_window
      begin = end = 0
    }
    
    BEGIN {
      MIN_BLOCK_LENGTH = 2
      delete block_window[0]
      begin = end = 0
    }
    
    !$0 {
     finalize_block()
     next
    }
    
    { block_window[end++] = $0 }
    
    length(block_window) > MIN_BLOCK_LENGTH {
      if (newline_due) print ""
      newline_due = 0
      print block_window[begin]
      delete block_window[begin++]
    }
    
    END { finalize_block() }
    

    Když to splácáme všechno dohromady, bude to dokonce i fungovat:

    ./test.sh ./window.awk
    

    Výsledné diffy ukazují, že to skutečně požírá unwanted řádky, že to mezi bloky wanted řádků nechává vždy právě jeden prázdný řádek, ať už prázdných řádků a příliš krátkých bloků mezi nimi bylo, kolik chtělo, že to netrousí prázdné řádky na začátku a konci výstupu, atd.

    Leč když to aplikujeme na jedno níže uvedené řešení, tak … ejhle, je to rozbité:

    ./test.sh sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }'
    

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.