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 04:55 | Nová verze

    Bylo oznámeno vydání nové verze 8.1 "Hoare" kolekce svobodného softwaru umožňujícího nahrávání, konverzi a streamovaní digitálního zvuku a obrazu FFmpeg (Wikipedie). Doprovodný příspěvek na blogu Khronosu rozebírá kódování a dekódování videa pomocí Vulkan Compute Shaders v FFmpeg.

    Ladislav Hagara | Komentářů: 1
    dnes 04:33 | Zajímavý projekt

    Byl představen open-source a open-hardware prototyp nízkonákladového raketometu kategorie MANPADS, který byl sestaven z běžně dostupné elektroniky a komponent vytištěných na 3D tiskárně. Raketa využívá skládací stabilizační křidélka a canardovou stabilizaci aktivně řízenou palubním letovým počítačem ESP32, vybaveným inerciální měřicí jednotkou MPU6050 (gyroskop a akcelerometr). Přenosné odpalovací zařízení obsahuje GPS,

    … více »
    NUKE GAZA! 🎆 | Komentářů: 3
    včera 14:22 | IT novinky

    Vědci z univerzity La Sapienza v Římě vyvinuli systém, který dokáže identifikovat jednotlivce pouze na základě toho, jak narušují signály Wi-Fi. Autoři tuto novou technologii nazvali WhoFi. Na rozdíl od tradičních biometrických systémů, jako jsou skenery otisků prstů a rozpoznávání obličeje, nevyžaduje tato metoda přímý fyzický kontakt ani vizuální vstupy. WhoFi může také sledovat jednotlivce na větší ploše než kamera s pevnou polohou; stačí, je-li k dispozici Wi-Fi síť.

    Ladislav Hagara | Komentářů: 10
    včera 04:22 | Nová verze

    SuperTux (Wikipedie), tj. klasická 2D plošinovka inspirovaná sérií Super Mario, byl vydán v nové verzi 0.7.0. Videoukázka na YouTube. Hrát lze i ve webovém prohlížeči.

    Ladislav Hagara | Komentářů: 7
    včera 03:11 | Zajímavý projekt

    Ageless Linux je linuxová distribuce vytvořená jako politický protest proti kalifornskému zákonu o věkovém ověřování uživatelů na úrovni OS (AB 1043). Kromě běžného instalačního obrazu je k dispozici i konverzní skript, který kompatibilní systém označí za Ageless Linux a levné jednodeskové počítače v ceně 12$ s předinstalovaným Ageless Linuxem, které se chystají autoři projektu dávat dětem. Ageless Linux je registrován jako operační

    … více »
    NUKE GAZA! 🎆 | Komentářů: 9
    15.3. 15:33 | Humor

    PimpMyGRC upravuje vzhled toolkitu GNU Radio a přidává alternativní barevná témata. Primárním cílem autora bylo pouze vytvořit tmavé prostředí vhodné pro noční práci, nicméně k dispozici je nakonec celá škála barevných schémat včetně možností různých animací a vizuálních efektů (plameny, matrix, bubliny...), které nepochybně posunou uživatelský zážitek na zcela jinou úroveň. Témata jsou skripty v jazyce Python, které nahrazují

    … více »
    NUKE GAZA! 🎆 | Komentářů: 3
    15.3. 14:33 | Nová verze Ladislav Hagara | Komentářů: 1
    15.3. 12:33 | Zajímavý projekt

    FRANK OS je open-source operační systém pro mikrokontrolér RP2350 (s FRANK M2 board) postavený na FreeRTOS, který přetváří tento levný čip na plně funkční počítač s desktopovým uživatelským rozhraním ve stylu Windows 95 se správcem oken, terminálem, prohlížečem souborů a knihovnou aplikací, ovládaný PS/2 myší a klávesnicí, s DVI video výstupem. Otázkou zůstává, zda by 520 KB SRAM stačilo každému 😅.

    NUKE GAZA! 🎆 | Komentářů: 5
    14.3. 22:55 | IT novinky

    Administrativa amerického prezidenta Donalda Trumpa by měla dostat zhruba deset miliard dolarů (asi 214 miliard Kč) za zprostředkování dohody o převzetí kontroly nad aktivitami sociální sítě TikTok ve Spojených státech.

    Ladislav Hagara | Komentářů: 2
    14.3. 21:33 | Nová verze

    Projekt Debian aktualizoval obrazy stabilní větve „Trixie“ (13.4). Shrnuje opravy za poslední dva měsíce, 111 aktualizovaných balíčků a 67 bezpečnostních hlášení. Opravy se týkají mj. chyb v glibc nebo webovém serveru Apache.

    |🇵🇸 | Komentářů: 2
    Které desktopové prostředí na Linuxu používáte?
     (16%)
     (7%)
     (0%)
     (11%)
     (29%)
     (2%)
     (5%)
     (1%)
     (13%)
     (24%)
    Celkem 1096 hlasů
     Komentářů: 26, poslední 12.3. 08:56
    Rozcestník

    Dotaz: sed, awk - smazání jedné řádky mezi prázdnými řádkami?

    12.5.2024 23:03 Fredy72 | skóre: 9
    sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    Přečteno: 1174×
    Mám soubor, kde jsou řádky a prázdné řádky. Potřebuji smazat každou jednu řádku, pokud před ní a za ní je prázdná řádka (nebo začátek či konec souboru), tj. ponechat pouze víceřádkové texty oddělené prázdnými řádkami. Soubor vypadá třeba takto:
    jedna
    dva
    
    tři
    
    čtyři
    pět
    šest
    
    sedm
    
    osm
    devět
    deset
    
    
    Výsledek je smazání řádky tři a sedm a ke každé též jedné prázdné řádky, aby vzniklo:
    jedna
    dva
    
    čtyři
    pět
    šest
    
    osm
    devět
    deset
    
    

    Řešení dotazu:


    Odpovědi

    13.5.2024 00:46 jejda | skóre: 27 | blog: jejda
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    Bych na to šel asi tak, že bych to všecko spojil do jednoho řádku na kterém bych newlines nahradil nějakým speciálním znakem. Třeba křížkem '#'. Teda dva křížky po sobě znamenají prázdný řádek. Potom by se muselo to slovo ohraničené dvouma křížkama vyříznout a to místo nějak označit. Třeba závináčem '@'. Dál už se jenom nahradí ten závináč dvěma newlines a křížek jednou newline. Na tom ukázkovém textu co napsals mi to docela funguje.
    cat soubor.txt | paste -sd# | sed 's/##[[:alnum:]]*##/@/g;s/@/\n\n/g;s/#/\n/g'
    Jestli se v tom tvojem textu vyskytujou křížky nebo závináče, budeš muset místo nich zvolit jinačí znaky.
    13.5.2024 01:19 jejda | skóre: 27 | blog: jejda
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    Hm teď to zkouším a moc dobře to nefunguje. Když je těch jednořádkových trojřádků :-D víc po sobě, je potřeba celý ten cirkus aplikovat taky víckrát po sobě. Ale nakonec to dopadne.
    13.5.2024 02:10 jejda | skóre: 27 | blog: jejda
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    On se vlastně může ten závináč taky uplně vynechat ...
    paste -sd# | sed 's/##[[:alnum:]]*##/\n\n/g;s/#/\n/g'
    Nějak mi to nemyslí.
    13.5.2024 08:51 BFU
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    Nestacilo by "| sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }'" ?

    Nejdrive to namatchuje na prazdny radek, pak appendne dva nasledujici radky do pattern space, a pokud tam je newline-text-newline, tak to nahradi newlinem .
    13.5.2024 14:50 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše

    Tak se podívejme, jestli by to stačilo:

    sed '/^$/ { N;N; /^\n.\+\n$/ s@.*@@ }' \
    <<< $'\n\na\n\nb\n\nc\nd\n\ne\n\n\nf\n\ng\n\n\nh\n\ni\nj\nk\n\nl'
    

    Očekávání:

    c
    d
    
    i
    j
    k
    

    Tvrdá realita:

    
    
    a
    
    c
    d
    
    
    g
    
    
    h
    
    i
    j
    k
    
    l
    

    Tyhle domácí úkoly obvykle vyžadují pár triků — právě proto, aby se nedaly tak snadno „vyřešit“ na ABCLinuxu.

    13.5.2024 16:38 Fredy72 | skóre: 9
    Rozbalit Rozbalit vše Re:
    Děkuji za snahu. Nejde o domácí úkol, jen jsem se snažil upravit řešení pod bodem 3. tady https://unix.stackexchange.com/questions/678461/finding-duplicate-files-with-same-filename-and-exact-same-size/678485#678485 Mám velké datové pole s BTRFS, kde věci jako duperemove, bees, fdupes trvají neúměrně dlouho a přitom se mi tam v podstatě objevují násobně jen úplně shodné soubory (název, délka). Tak jsem využil ten skript z odkazu, který však vynechává jeden (první) z duplicitních souborů. Upravil jsem proto diff tak, aby mi vypsal unikátní soubory se všemi soubory, a právě ty unikátní jsou ve výpisu osamocené mezi dvěma prázdnými řádky. Takže to potřebuji proparsovat, aby to duperemove vzalo jako formát fdupes (tedy už jen seznam těch duplicitních oddělených mezerou). Možná objevuji Ameriku, ale přijde mi ten skript rychlý, na úrovni rychlosti příkazu find.
    13.5.2024 18:23 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
    Rozbalit Rozbalit vše Re:
    Nebyl by pro tebe řešením rmlint?
    13.5.2024 18:45 Fredy72 | skóre: 9
    Rozbalit Rozbalit vše Re:
    Kouknu na parametry rmlint. Ty soubory jsou pro představu něco jako fotky, takže mají dost unikátní název, nejsou moc cenné (duperemove --fdupes nepočítá hash) a nemění se jejich velikost. Samozřejmě by bylo lepší přidat tam kontrolu hash, takže optimálně nějaký nástroj, co by na počátku jen vyhledal stejné názvy a pokud mají i stejnou velikost, tak pak teprve spočítal kontrolní součet a pokud v pořádku, tak poslal do duperemove.
    13.5.2024 20:14 Fredy72 | skóre: 9
    Rozbalit Rozbalit vše Re:
    Z netu jsem poskládal něco, co vypadá schopně:
    find DIR -not -empty -type f -printf "%s\t%f%-260s\t%p\n" | sort -k 1,2 -t$'\t' | uniq -w260 -D | cut -f 3 -d $'\t' | xargs md5sum | sort | uniq -w32 --all-repeated=separate | cut -c 34-
    
    13.5.2024 21:00 Want
    Rozbalit Rozbalit vše Re:
    No já jen, že jsem tehdy řešil přesně to samé co ty.
    13.5.2024 23:05 Fredy72 | skóre: 9
    Rozbalit Rozbalit vše Re:
    A jak dopadl výsledek?
    14.5.2024 09:24 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
    Rozbalit Rozbalit vše Re:
    Podle očekávání. Jak jinak? Jinak bych nepsal ten blogpost. Jenom zdůrazňuji – přečti si ho pozorně a hlavně to, jaký je rozdíl mezi hardlinkem, symlinkem a reflinkem.
    Řešení 1× (Andrej)
    13.5.2024 18:39 čavo | skóre: 16
    Rozbalit Rozbalit vše Re:
    Trošku som sa pohral, použil som na test vygenerovaný jednopísmenný zoznam.

    Aby sa nebolo treba hrať so začiatkom a koncom, som tam pridal nové riadky, ktoré som nakonci zrušil.

    No a môže byť aj viac ako jeden nový riadok:
    (echo; echo; cat data.txt; echo;echo ) |  paste --serial --delimiters=\# | sed 's/##\+\([^#]\+##\+\)\+/##/g;s/^##\+//;s/##\+$//;s/#/\n/g'
    c
    d
    
    i
    j
    k
    
    13.5.2024 20:49 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re:

    Jo, mým testem to prochází v pohodě.

    13.5.2024 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@.*@@ }'
    
    Řešení 1× (Andrej)
    wamba avatar 15.5.2024 17:34 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    perl -00nE 'print  if split("\n", $_) >= 2'
    Jen pro pořádek tady je ten Perl.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    Řešení 1× (Andrej)
    wamba avatar 15.5.2024 17:42 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    popřípadě
    perl -F'\n' -00E 'print  if @F >= 2'
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    2.6.2024 12:33 mikrom
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    podobne ako one-liner v perle sa da tiez pouzit one-liner v awk:
    cat fredy72.txt | awk 'BEGIN{RS=""}{if(split($0,a,"\n")>=2)print $0"\n"}'
    4.6.2024 21:24 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?

    To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti. Za to by zápočet nebyl. Ale je to cool, to bezesporu.

    (Kromě toho to není správně; trousí to prázdné řádky na konci.)

    awk 'BEGIN { RS = "" }
         split($0, a, "\n") >= 2 {
           print p "\n"
           p = $0
         }
         END { if (p) print p }'
    

    Tahle↑ verze by vyřešila ty extra řádky, ale celý blok v paměti mi nepřijde jako výhra.

    wamba avatar 6.6.2024 18:50 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    ale celý blok v paměti mi nepřijde jako výhra
    RS = "\n\n", není řešením? možná něco jako
    awk 'BEGIN{RS="\n\n";FS="\n";ORS="\n\n"}{if($2)print $0}'
    
    ale AWK víceméně nepoužívám, takže jen odhaduji.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    7.6.2024 01:27 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?

    FS = "\n" → zase celý blok v paměti. Když budu mít blok o velikosti 100 TB, než přijde první "\n\n", tak to na většině mašin nedám.

    V testu to dopadne ještě hůř než minulý one-liner, protože (1) na konci to trousí hned 2 extra prázdné řádky a (2) i uprostřed to trousí prázdné řádky, například na tomhle:
    wanted
    wanted
    
    unwanted
    
    
    wanted
    wanted
    
    (Off-topic: „{if($2)print $0}“ se řekne prostě $2.)
    7.6.2024 16:07 mikrom
    Rozbalit Rozbalit vše Re: sed, awk - smazání jedné řádky mezi prázdnými řádkami?
    "To ale vyžaduje, aby se vešel celý blok (mezi osamocenými řádky) do paměti."
    K tomu ma inspiroval ten perl on-liner hore, kde je pouzita command line option:
    -00
    Ta option, alebo nastavenie premennej v skripte
    $/ = ""
    sposobi, ze perl bude pracovat v tzv. paragraph mode, t.j. po blokoch.

    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.