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 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 4
    dnes 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    dnes 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

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

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (17%)
    Celkem 763 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Obdoba diff - skript bash

    18.6.2006 17:02 Delphik
    Obdoba diff - skript bash
    Přečteno: 606×
    Dobrý den, jsem začátečník v bashi a vlastně i v linuxu, proto se obracím s prosbou o radu na zkušenější kolegy. Potřeboval bych v bashi naprogramovat náhradu příkazu diff na porovnání dvou souborů a to jen bez přepínáčů. Takže výsledný skript by se spouštěl ./porovnani.sh ./soubor1 ./soubor2 a vypsal by, které řádky nejsou v 1. a pak které nejsou v 2. souboru, popřípadě nic pokud jsou shodné. Předem děkuji za pomoc a omlouvám se že tu řeším takovouto "banalitu"

    Odpovědi

    18.6.2006 17:53 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Ahoj. Já sice skripty v BASHi nepíšu, ale tohle funguje:
    #!/usr/bin/env python
    import sys,os
    
    def getlines(filename):
        lines = {}
        for num, line in enumerate(file(filename)):
            lines[line.rstrip()] = num + 1
        return lines
    
    def compare(linesx, linesy):
        for line in linesx.keys():
            if linesy.has_key(line):
                continue
            print linesx[line], line
    
    lines1 = getlines(sys.argv[1])
    lines2 = getlines(sys.argv[2])
    
    compare(lines1, lines2)
    print '-'*80
    compare(lines2, lines1)
    
    A když to otestuju třeba na těchto souborech
    $ cat soubor1
    prvni
    spolecny
    treti
    tohle neni v tom druhem
    druhy
    
    $ cat soubor2
    prvni
    druhy
    treti
    spolecny
    a tohle zase neni v tom prvnim
    
    Tak to vypíše
    $./difflines.py soubor1 soubor2
    4 tohle neni v tom druhem
    ---------------------------------------------
    5 a tohle zase neni v tom prvnim
    
    Ukazuje to i čísla řádků.
    18.6.2006 18:20 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Eventuelně takhle:
    import sys
    a = file(sys.argv[1]).readlines()
    b = file(sys.argv[2]).readlines()
    sys.stdout.writelines([x for x in a if not x in b])
    sys.stdout.writelines([x for x in b if not x in a])
    
    ... ale to je jen taková hříčka.
    18.6.2006 19:39 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Něco jako
    a, b=ARGV[0..1].map{|x| File.open(x).readlines }
    puts a-b; puts b-a
    ? :-D ;-)
    18.6.2006 18:37 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Skriptík je to krásný, děkuji za pomoc, ale potřeboval bych ho přeci jenom v bashi. Přesto, ještě jednou děkuji.
    18.6.2006 18:56 Käyttäjä 11133 | skóre: 58 | blog: Ajattelee menneisyyttä
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    A kterou vysokou školu že to studuješ? :-) Zase úkol?
    18.6.2006 20:39 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Kdyby VŠ ;-)
    19.6.2006 22:25 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Připadám si diskriminován. Když se řekne "v Bashi", tak se tím automaticky myslí všechno možné, ale python bohužel ne. ;-)
    $ cat soubor1 soubor2 | sort | uniq --unique
    a tohle zase neni v tom prvnim
    tohle neni v tom druhem
    
    19.6.2006 22:27 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    ... a kdo bude chtít, může si odstranit nejzbytečnější cat na světě. :-)
    19.6.2006 22:34 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Jestli si myslím správně, co je uniq --unique, tak by toto bylo nejjednodušší řešení a bylo by to super, jen jsem to zkoušel takhle fláknout do linuxu a nic. (Takhle ne;-) soubor1 a soubor2 jsem nahradil názvem souborů, které existujou)
    19.6.2006 22:59 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    A nedal jsi tam omylem dva stejné názvy souborů, jako se mi to stalo před chvílí? :-)
    Mě to funguje:
    chorchoj:22:56:12 ~$ cat soubor1
    prvni
    spolecny
    treti
    tohle neni v tom druhem
    druhy
    chorchoj:22:56:16 ~$ cat soubor2
    prvni
    druhy
    treti
    spolecny
    a tohle zase neni v tom prvnim
    chorchoj:22:56:18 ~$ sort soubor1 soubor2 | uniq --unique
    a tohle zase neni v tom prvnim
    tohle neni v tom druhem
    
    19.6.2006 23:18 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Nojo - jenže ono to nebude fungovat, když nějaký řádek bude v jednom souboru vícekrát. Že jsem se do toho vůbec pouštěl ...
    21.6.2006 21:48 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Potřeboval bych poradit. Opět. Dá se nějak zjistit úspěšnost nebo jinak nalezení něčeho pomocí sedu? Mám sed -n "/$searchstr/=" $i >out.s, kde $searchstr je vlastně regulární výraz a v $i je uložen název souboru dá se tedy nějak zjisti jestli něco našel a zapsal do souboru nebo to musím obejít nějak jinak. díky
    21.6.2006 21:53 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Zkontrolovat, zda má výsledný soubor nulovou délku?
    21.6.2006 21:58 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Zkusit to mohu a to udelam? Promin takove blbe dotazy. :-)
    21.6.2006 22:05 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    man test
    ...
           -s soubor
                  Pravda, když soubor existuje a má délku větší než nula.
    ...
    
    -- Nezdar není hanbou, hanbou je strach z pokusu.
    21.6.2006 22:11 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Děkuji ti mnohokrát.Dost jsi mi pomohl.
    Jan Zahornadsky avatar 18.6.2006 19:03 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Ono asi záleží na přesném zadání -- protože i diff má několik různých algoritmů, které může na soubory aplikovat. Podle zvoleného algoritmu provnávání souborů se pak dá začít bavit o konkrétní implementaci. Nejzajímavější bude dle mně nějak vyřešit, že může být jen jeden stdin (pro while cyklus nebo jak se to bude implementovávat). A ještě zajímavá informace je, zda a jaké verze standardních nástrojů jako sed, grep lze užívat (je třeba možné užít GNU-specific rozšíření?).
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    18.6.2006 20:38 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Přesné zadání: Napište skript, který porovnává dva soubory (viz man diff) Toť vše. Přesně jak říkáte, zajímavé je, jak vyřešit 2 vstupy pro while nebo zdali by to šlo nějak obejít. Nějak se v tom ztrácím. Nevím co je GNU-specific rozšířen. Jinak si myslím, že lze použít jakéhokoliv nástroje kromně vlastního diff, a jestli existují, tak i jeho odnože nejsou povoleny.
    18.6.2006 20:44 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Vidím dvě možnosti.

    Použiješ diff.

    Pokud nemůžeš použít diff, protože jsi to dostal za domácí úkol, tak je na čase, aby ses začal učit... Řešit domácím úkol stylem "plácnu to do diskuze, však on se někdo najde kdo to vyřeší" není nejlepší způsob.
    -- Nezdar není hanbou, hanbou je strach z pokusu.
    18.6.2006 21:11 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    No vidím, že ani pro tebe to neni hračka. Jinak by jsi to tu "vysmahl" a pak okomentoval. Zkus se nad tím zamyslet a uvidíš nové a nové problémy a pro člověka, který v tom skoro vůbec nedělá a nedělal (maximálně jednoduché příkazy grep, sed a awk jen zmíňka). Mně nejde o to, aby mi kdokoliv napsal přímo zdrojáček až pod nos, ale třeba jen nastínil řešení.
    18.6.2006 21:28 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Nikde tu nevidím tvou snahu problém řešit. Nevidím třeba nefunkční skript, který bys třeba napsal když jsi to zkoušel a podobně. Zkus si přečíst třeba návod na to jak se správně ptát. Domácí úkoly se totiž tímhle stylem neřeší. Zkus se nad tím zamyslet.

    Protože jsem to pochopil tak, že chceš aby ti někdo naservíroval hotový skript (jako desítky dalších kdesi v hlubinách fóra), rozhodl jsem se vůbec nepomáhat s řešením. To jestli něco umím nebo neumím nech na mě. Pokud chceš abych ti napsal řešení nebo poradil, můžeme se dohodnout na placené konzultaci, rád se ti potom budu věnovat.

    Výmluvy na to, že je někdo začátečník hned v úvodu dotazu nejsou moc dobrý nápad, proč se hned na začátek shazovat? Taky jsem jednou začínal a když si vzpomenu, kolik času jsem tomu věnoval tak si říkám, že v tom vymlouvajícího se začátečníka můžu nechat trochu vukoupat...

    Pokud chceš na mě reagovat, prosím nepiš to do diskuze ať tu nejsme OT. Napiš mi to emailem na zdenda@zdenda.com.
    -- Nezdar není hanbou, hanbou je strach z pokusu.
    Jan Zahornadsky avatar 18.6.2006 21:34 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Tak ten man diff jsem zběžně proletěl, ale ani uspokojivý popis algoritmu jsem tam nenašel. Ono když si vezmeme blbý postup typu vezmi jeden řádek z jednoho, jeden z druhého souboru, pokud se liší, vypiš změny, jinak nevypisuj nic je de facto porovnávání souborů. A toto lze lehce dosáhnout tím, že "smícháš" soubory tak, že sudé řádky jsou z jednoho, liché z druhého.

    Nebo diff-kompatibilní by v podstatě bylo i řešení, kdy napíšeš, že se soubory změnily tak, že z prvního ubyli všechny řádky a v druhém všechny jeho řádky přibyly. Na to stačí opravdu moc jednoduchý sed :-D

    Právě, že ty dva vstupy jsou pro bash problém (osobně bych užil třeba awk, ale zadání je zadání). Dalo by se to řešit (hodně násilně) nějakým "bufferem", kde v proměnných A1, A2, A3, A4, ... jsou řádky prvního souboru, v proměnných B1, B2, ... druhého souboru. Pak na to hodíš kdejaký algoritmus si zamaneš.

    Lepší by bylo ty soubory spojit, třeba jak jsem naznačoval o sudých a lichých řádcích (jen je potřeba si promyslet, co s případem, kdy nemají stejně řádků). Ale asi na tuto strukturu opět nenapasuješ všechny algoritmy porovnání souborů.

    Ad cokoli-specific: chtěl jsem naznačit, že například my ve škole na UNIXu povinně pracujeme na Solarisu<flame>, protože se jedná o mnohem stabilnější UNIX než GNU/Linux</flame>. Ale ten třeba nepodporuje mnoho rozšíření, které jsou typické pro GNU, tedy GNU-specific.

    Ale pokud můžeš kromě diff používat cokoli... Co takhle comm? Ale to je jen další nápad, vracíme se k tomu, že zadání je dost nejednoznačné...
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    19.6.2006 20:33 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Právě o to jde, jak v bashi načíst jeden řádek z 1 souboru a zároveň z 2. Nějak nevím, jak na to.
    Jan Zahornadsky avatar 19.6.2006 21:57 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Právě to co vím uspokojivě nejde. Proto se ptám na algoritmus, který bys chtěl použít. Třeba to nebude potřeba (až tolik), třeba jak jsem naznačoval, ty řádky prokládaně zapsat do třetího souboru a pak číst jen ten jeden.

    V nejhorším případě lze celý jeden soubor načíst do proměnných shellu a druhý číst standardně... Ale to je řešení dost omezující, předpokládá, že soubory jsou rozumně velké.
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    19.6.2006 22:14 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Asi máš pravdu s tím smícháním souborů a výpisem, pokud se lichá řádka liší od sudé. Tím mne napadá otázka, jak se bude vlastně porovnávat? Co když bude v jednom souboru řádek jiný chybět. např
    1. soubor
    1
    2
    3
    4
    2. soubor
    1
    2
    4
    5
    Smíchaný soubor (jestli to dobře chápu)
    1
    1
    2
    2
    3
    4
    4
    5
    Pokud ho budu porovnávat po dvojicích, tak bude, podle mne, vyhazovat nesmysli typu 3 není v pravo a 4 není vlevo a to samé pro 4 a 5 ne? Pak jsi něco psal o nějakém velice jednoduchém sedu, ale to nějak nechápu.
    Jan Zahornadsky avatar 19.6.2006 23:29 Jan Zahornadsky | skóre: 22 | blog: hans_blog
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Ne, to funguje a nesmysly nehází. I klasický diff se někdy "zasekne" a řekne mi, že jsem hromadu řádků z jednoho souboru odebral a až nápadně podobnou hromadu řádků přidal. Toto púrokládání souborů je použitelné pouze u tohoto algoritmu (který, jen tak mezi námi, je pitomý až moc).

    Takže ten tvůj příklad napíše (jelikož výstup diffu není jednoznačný, existuje mnoho různých, ale správných řešení):
    3c3
    < 3
    ---
    > 4
    4c4
    < 4
    ---
    > 5
    
    Ohledně toho jednoduchého sedu -- tento prokládaný soubor nemusíš read-ovat po jednom řádku (pokud má hodně řádků, tak si kernel užije naplno fork() a exec() ;-) ). Protože navíc jeho struktura je dost jednoduchá a algoritmus ještě jednodušší, tak by se dal tento soubor jen prohnat sed skriptem a bylo by. Ale taky. Má to svá úskalí, třeba nevím, jak sed může zjistit, na kolikátém řádku se nachází apod. To by se třeba tedy do toho slitého souboru přidalo na začátek řádku nějaké info v pevném formátu (třeba první číslo na řádku by značilo první nebo druhý soubor, druhé číslo by značilo číslo řádku a pak právě jedna mezera a samotný řádek).
    Actually, I was half an hour into the pointer scripting documentation when she got dressed and left.
    19.6.2006 22:02 tomas
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Načtení dvou řádků se provede takto:
    exec 3<soubor1
    exec 4<soubor2
    IFS=''
    read -u 3 line1
    read -u 4 line2
    
    Napsat plně funkční diff nebude trivální. Začal bych tím, že bych nadefinoval zjednodušené zadání. Omezení by bylo takové, že je povolen maximální rozdíl 1 řádek v oblasti začínající a končící úplnou shodou.
    19.6.2006 22:21 Delphik
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    OK, díky
    Jakub Hájek avatar 19.6.2006 22:05 Jakub Hájek | skóre: 14 | blog: zamek | Praha
    Rozbalit Rozbalit vše Re: Obdoba diff - skript bash
    Nenapadlo me nic jineho nez si brat (treba) sedem postupne prvni, druhy, treti radky z obou souboru a pak zpracovat, plus jeste nejakou pdominku jestli v nekterem souboru nejsem na konci..

    Kdyby nekdo vedel, jak to udelat jednopruchodove, tak se take velmi rad priucim..
    Teprve tehdy, až nebudeme mít co ztratit, budeme opravdu svobodní.

    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.