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 07:00 | Nová verze

    Byla vydána verze 2.12 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.

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

    Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 23.11 Topi. Přehled novinek v Changelogu.

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

    Po 4 měsících vývoje byla vydána nová verze 4.2 multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu a na YouTube.

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

    Byla vydána nová stabilní verze 23.11 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Tapir. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.

    Ladislav Hagara | Komentářů: 0
    včera 14:11 | Bezpečnostní upozornění

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) upozorňuje na hrozbu spojenou s používáním mobilní aplikace WeChat a její čínské verze Weixin (dále jen WeChat). Ta sbírá velký objem uživatelských dat, a právě to by – v kombinaci se způsobem jejich sběru – mohlo sloužit k přesnému zacílení kybernetických útoků.

    Ladislav Hagara | Komentářů: 0
    včera 14:00 | Zajímavý software

    LibreQoS je svobodná aplikace vhodná pro poskytovatele internetové připojení pro rezervaci a řízení datových toků zákazníků (QoS - Quality of Service, QoE - Quality of Experience). Zdrojové kódy jsou k dispozici na GitHubu pod licencí GPLv2. Aktuální verze je 1.4.

    Ladislav Hagara | Komentářů: 0
    29.11. 23:22 | Nová verze

    Byla vydána Beta 1 verze KDE 6 (Plasma, Frameworks a Gear) postavené na Qt 6. Testovat lze například v distribuci KDE Neon. Stabilní verze je plánována na konec února 2024. Předchozí velké vydání 5 vylo vydáno téměř před 10 lety (červenec 2014).

    Ladislav Hagara | Komentářů: 19
    29.11. 23:00 | Komunita

    Open-source webmail Roundcube se připojil k balíku aplikací Nextcloudu. Převzetí firmou Nextcloud ale plánováno není, pouze integrace a podpoření vývoje.

    Fluttershy, yay! | Komentářů: 0
    29.11. 18:44 | IT novinky

    Stability AI představila SDXL Turbo, tj. umělou inteligenci pro generování obrázků z textového popisu v reálném čase, viz ukázka na YouTube.

    Ladislav Hagara | Komentářů: 1
    29.11. 12:33 | Nová verze

    Svobodná webová platforma pro sdílení a přehrávání videí PeerTube (Wikipedie) byla vydána v nové major verzi 6. Přehled novinek i s náhledy a videi v oficiálním oznámení a na GitHubu (6.0.0, 6.0.1).

    Ladislav Hagara | Komentářů: 0
    Používáte modální textový editor?
     (76%)
     (3%)
     (2%)
     (20%)
    Celkem 290 hlasů
     Komentářů: 8, poslední 16.11. 22:24
    Rozcestník

    Dotaz: porovnani 2 souboru bash

    22.12.2012 17:54 mofas
    porovnani 2 souboru bash
    Přečteno: 614×
    Zdravim, darky zabaleny a tak si hraju s bashem, protoze potrebuju jednu takovou vecicku udelat. Mam 2 soubory, ktere oba obsahuji vzdy jen jeden rezetec na jednom radku. Tech retezcu je pod sebou i nekolik tisic. Nekdy se tyto retezce shoduji. A ja jsem si udelal program, ktery veme radek z kazdeho souboru, porovna je a vypise mi pouze ty retezce, ktere se nenachazeji v to prvnim souboru. Jak uz jsem rekl, mam to napsane, ale funguje to polovicate a nechapu proc (uz jsem aj buchnul do stolu a nic).

    Muj kod:

    while read radek; do

    if [ "`grep -i $radek $2`" != "`grep -i $radek $1`" ]; then
          echo $radek >> vysledek.txt
    else
          echo $radek >> /dev/null
    fi

    done < $1

    Program spoustim takhle:

    ./ program.sh soubor_1 soubor_2

    Uvedu priklad:

    soubor_1 obsahuje:

    a

    b

    c

    d

    e

    f

    g

    soubor_2 obsahuje:

    g

    b

    e

    d

    i

    g

    vysledny soubor vysledek.txt obsahuje:

    a

    c

    f

    g

    Je to spravne, jen ten posledni znak g tam nema byt, proc tam je? Vzdyt se nachazi v obou souborech. Tohle mi hlava nebere

    Podotykam, že $1 je soubor_1 a $2 je soubor_2. Diky za nakopnuti a preju hezke svatky!

    Řešení dotazu:


    Odpovědi

    pepe_ avatar 22.12.2012 18:15 pepe_ | skóre: 48
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash

    A co konec řádku , není tam cr_lf nebo nějakej podobnej paznak kterej neni vidět ?

    22.12.2012 18:36 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    pod posledním řetězcem v obou souborech je pouze prázdný řádek. Jinak vždy na každém řádku vedle řetězce není nikdy žádný bílý znak nebo cokoliv neviditelného.
    22.12.2012 18:26 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    To musí být hrozně pomalé. Nebyl by lepší diff?

    Potřebuješ to k nějaké funkčnosti nebo je to jen cvičení?
    22.12.2012 18:42 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Ještě před dvěma hodina jsem měl řešení s diffem, ale asi jsem ho špatně pochopil, protože mi vypisoval i řádky, které se shodují v obou souborech. Však diff prochází tak, že veme první řádek z prvního souboru a první řádek z druhého souboru a porovná je...pak zase veme druhé řádky z obou souborů atd.. Jenže když se řádky, které se shodují, budou každý jinde v souboru, tak to už neodhalí, nebo se mýlím?

    Pomalé to je, a ještě se to zpomalilo, když jsem tam dodal do podmínky tohle:

    if [ "`grep -i $radek $2 | tr [A-Z] [a-z]`" != "`grep -i $radek $1 | tr [A-Z] [a-z]`" ]; then

    Zkrátka, aby to převedlo všechno na malé znaky...aby mi to nevyhodilo neshodu na základě toho, že se někde v řetězci nachází velké písmenko.
    22.12.2012 19:06 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Pokud nezáleží na pořadí, je možné záznamy před diff seřadit sortem.

    Také je možné první soubor natáhnout do nějakého asociativního pole a druhý soubor s ním porovnat.
    22.12.2012 19:17 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Jeejda, na sort jsem uplně zapomněl. Díky. To asociativní pole, s tím vůbec zkušenosti nemám, nevím jak by se to dělalo. Ono až tak nezáleží jak rychle to pojede. Ted jsem si zkusil 2 největsi soubory a za minutku to bylo hotove.

    Ze zvědavosti, mohl byste nastánit jak by to s tím asoc. polem vypadalo? Celkem mě to zajímá. Díky
    22.12.2012 19:37 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Nejlepší by to asi bylo v Perlu, ale zrovna mě napadlo to vyzkoušet v SQLite:
    #!/bin/bash
    
    sqlite3 <<EOT
    .separator '|||'
    create table a(nazev text);
    .import a.txt a
    create index inda on a (nazev);
    create table b(nazev text);
    .import b.txt b
    select nazev from b where lower(nazev) not in (select lower(nazev) from a);
    EOT
    
    22.12.2012 20:06 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    co jsem tam koukal, tak i bash ma nejake pole. Diky za nastin reseni!
    22.12.2012 20:20 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    To je sice pravda, ale snad každý jazyk to má vyřešeno lépe. Třeba v PHP to také není těžké:
    <?php
    $a=array();
    foreach (file('a.txt') as $line) {
        $a[strtolower(trim($line))]=$line;
    }
    foreach (file('b.txt') as $line) {
        if (!isset($a[strtolower(trim($line))])) {
            echo trim($line),"\n";
        }
    }
    
    22.12.2012 20:54 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    skvělé, tak tohle je i na první pohled čitelnější a jistě rychlejší ;) Díky ještě jednou
    24.12.2012 04:44 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    …ale jen dokud se vejdete do paměti.
    24.12.2012 07:20 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Těch řádek je dle dotazu jen několik tisíc. Předpokládám, že jsou "normálně" dlouhé a že problém s RAM nebude muset řešit. Jinak může použít DB.
    24.12.2012 03:56 deadmail
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Rozdiely (co je len v prvom, len v druhom alebo v obochoch) dvoch usporiadanych suborov vypisuje comm.

    Len v druhom:
    comm -13 <(sort soubor_1) <(sort soubor_2)
    24.12.2012 14:54 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    děkuju, o tomto příkazu jsem snad ještě neslyšel! Nicméně řešení je rychlé a efektivní. Díky
    24.12.2012 14:59 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Tedy až na to, že mi to vypíše znova skoro celý soubor. Při parametru pouze "-3" to ve vyslednem souboru sice ukáže znova všechno, ale řádky, které se liší, tak ty nechá na začátku řádky a před všechny zbylé řádky hodí tabulátor.
    24.12.2012 17:34 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    i kdyz to spustim jen s parametrem "-3" tak mi to vypíše jako neshodu 2 shodne retezce.

    Jak může comm říct, že tohle jsou rozdílné řetězce:

    Robert_Natus_-_Back_To_Led_(Holz56)-Promo_EP-2002-TR

    Robert_Natus_-_Back_To_Led_(Holz56)-Promo_EP-2002-TR

    ??? Žádný rozdíl ve velikosti znaku, žádné bílé znaky, žádné jiné neviditelné znaky....
    24.12.2012 18:15 Kit
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Když si to vypíšeš hexdumpem, možná nějaký rozdíl najdeš.
    24.12.2012 20:52 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    tak už jsem to rozchodil. Nevím doted jaká byla přesná chyba, ale když už jsem z toho pomalu šílel a naprosto totožný kod dělal něco jiného než předtím, tak jsem resetoval system, a pak už bylo vše v pořádku. comm je skvělý nástroj, trošku jsem si to upravil, aby neuvažoval rozdíl ve velikosti písmen:

    comm -3 <(cat $1 | tr [A-Z] [a-z] | sort) <(cat $2 | tr [A-Z] [a-z] | sort) > vysledek.txt

    Díky ještě jednou!
    24.12.2012 04:41 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash

    1. V jednom souboru máte řádek "g" jednou a ve druhém dvakrát, proto vám to porovnání nevyjde.

    2. Kromě zoufalé neefektivity je použití grepu špatně, protože grep vám vrátí i všechny řádky, kde se vzorek vyskytuje jako podřetězec. Co hůř, vzorek se chápe jako (basic) regulární výraz, takže bude-li obsahovat např. tečku, nebudete se stačit divit, co všechno bude matchovat.

    3. K čemu je podle vás dobrá ta "else" větev (kromě zpomalení skriptu)?

    24.12.2012 15:06 mofas
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    ad 1. chápu

    ad 2. chápu, je to pomalé a neefektivní (zplácal jsem to za pár minut), nicméně funguje jak má (ještě jsem to trochu dovylepšil). Abych grepu zabránil brát vzorec jako basic RE, tak stačí dát vzorek do uvozovek "$vzorek"?

    ad 3. moje blbost, stydím se, díky za upozornění!
    24.12.2012 21:52 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: porovnani 2 souboru bash
    Abych grepu zabránil brát vzorec jako basic RE, tak stačí dát vzorek do uvozovek "$vzorek"?

    Ne, tím jen zařídíte, aby shell neinterpretoval znaky, které jsou pro něj speciální (třeba mezery). Pro chápání vzorku jako řetězce by měl pomoci přepínač -F (nebo spouštět jako fgrep). Ale pořád bude potřeba dávat pozor na podřetězce nebo vícenásobné výskyty (podle způsobu použití).

    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.