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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

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

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 26
včera 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 7
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 14
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 15
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 5
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 774 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Obdoba diff - skript bash

18.6.2006 17:02 Delphik
Obdoba diff - skript bash
Přečteno: 549×
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.
Marek Stopka avatar 18.6.2006 18:56 Marek Stopka | skóre: 57 | blog: Paranoidní blog | London, United Kingdom
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: 71 | 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.