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 13:22 | Nová verze

Po roce od vydání verze 4.0 byla vydána nová major verze 5.0 softwaru pro správu elektronických knih Calibre (Wikipedie). Přehled novinek v poznámkách k vydání. Zdůraznit lze přechod na Python 3.

Ladislav Hagara | Komentářů: 0
dnes 07:00 | Komunita

Pořadatelé konference DevConf.cz 2021, již třináctého ročníku jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, vyhlásili CFP (Call for Papers). Konference proběhne jenom online a to 18. až 20. února 2021.

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

Národní bezpečnostní agentura (NSA) vydala podrobnou příručku pro nastavení UEFI Secure Bootu (pdf).

Ladislav Hagara | Komentářů: 4
včera 15:22 | Nová verze

Byl vydán PostgreSQL ve verzi 13.0. Přehled novinek v poznámkách k vydání.

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

Nezávislý tým herních vývojářů Orama Interactive vydal novou verzi 0.8 svobodného sprite editoru Pixelorama. Editor Pixelorama je postaven na herním enginu Godot a nově běží také na webu. Zdrojové kódy jsou k dispozici na GitHubu.

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

Mozilla Foundation na svém blogu představila Social Media Analysis Toolkit (SMAT). Jedná se o open source nástroj pro analýzu a vizualizaci online komunikace a trendů na sociálních sítí. Zdrojové kódy jsou k dispozici na GitLabu.

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

Pod licencí GPLv3 byly vydány zdrojové kódy počítačových her Amnesia: The Dark Descent a Amnesia: A Machine For Pigs od společnosti Frictional Games. Počítačová hra Amnesia: The Dark Descent vyšla před 10 lety. V říjnu vyjde pokračování s názvem Amnesia: Rebirth.

Ladislav Hagara | Komentářů: 0
včera 07:00 | Nová verze

Po téměř pěti měsících od vydání verze 1.24 byla vydána nová verze 1.25 knihoven EFL (Enlightenment Foundation Libraries). Do vývoje EFL se zapojilo 38 vývojářů. Provedeno bylo 567 commitů.

Ladislav Hagara | Komentářů: 2
23.9. 19:00 | Komunita

Po Fedoře bude již v září možné koupit pracovní stanice řady ThinkStation a notebooky značky ThinkPad od společnosti Lenovo také s předinstalovanou linuxovou distribucí Ubuntu 20.04 LTS.

Ladislav Hagara | Komentářů: 8
23.9. 13:44 | IT novinky

Sdružení CZ.NIC oznámilo, že služba mojeID se napojuje na NIA (Národní bod pro identifikaci a autentizaci), její uživatelé tak mohou plnohodnotně komunikovat se službami státu – bodové hodnocení řidiče, osobní list důchodového pojištění, e-recepty nebo potvrzení o studiu.

Ladislav Hagara | Komentářů: 20
Používáte aplikaci eRouška?
 (18%)
 (3%)
 (2%)
 (11%)
 (52%)
 (7%)
 (6%)
Celkem 421 hlasů
 Komentářů: 35, poslední 20.9. 21:50
Rozcestník

Dotaz: Nahrazeni mezer znakem

30.11.2005 18:54 Andrew
Nahrazeni mezer znakem
Přečteno: 743×
Hello,

pls nevite nekdo cim resp. jak nahradit mezery v souboru (log file) nejakym znakem? Zadrhel je v tom, ze potrebuji nahradit mezery pouze te casti, ktera je uvozena uvozovkami-" ".

Dik za tipy....

Odpovědi

David Watzke avatar 30.11.2005 19:12 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
$ cat log.file
" "
$ sed 's/" "/"_"/g' log.file
"_"
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 30.11.2005 19:13 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Oops, zřejmě jsem to špatně přečet. To co děláš bych udělal radši v grafickým editoru, vybral tu část a dal nahradit... Ale v shellu.. to ti musí poradit někdo jiný.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
30.11.2005 19:26 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
  #include <stdio.h>

  int main()
  {
    int c;
    int inside = 0;

    while ((c = getchar()) != EOF) {
      if (c == '"') inside = !inside;
      if (inside && c==' ') c = '_';
      putchar(c);
    }

    return 0;
  }
Zpracování chyb a/nebo parametrů si doplňte za cvičení.
30.11.2005 19:29 Andrew
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Dekuji, osetreni chyb provedu a odevzdam :)

Ale ja mel na mysli realizace v shellu....
1.12.2005 11:12 alex
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Reseni zalozene pouze na shellu bude v tomto pripade velice pomale. Jedina jeho vyhoda je v tom, ze nepotrebujete zadny externi program. Tak tady je reseni, pouzivajici jenom vestavene prikazy bash'e:
#!/bin/bash

ZAMENA="_"

IFS=
while read line ; do
	quote=0
	while read -n 1 char ; do
		if [ "$char" == " " ] ; then
			if [ $quote -eq 0 ] ; then
				outchar=" "
			else
				outchar="$ZAMENA"
			fi
		elif [ "$char" == '"' ] ; then
			quote=$((1 - quote))
			outchar='"'
		else
			outchar="$char"
		fi
		echo -n "$outchar"		
	done <<<"$line"
	echo
done
Obecne v ulohach takoveho typu vynika Perl. Tady je reseni v Perl'u:
$ perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' soubor.log
Na zaver uvedu srovnani rychlosti vsech 3 reseni (vcetne programu v C, napsaneho Michalem Kubeckem):
$ ls -sh /var/log/messages
716K /var/log/messages
$ time uvozovky.sh < /var/log/messages > /dev/null
real	2m12.561s
user	1m57.610s
sys	0m6.001s
$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /var/log/messages > /dev/null
real	0m0.038s
user	0m0.030s
sys	0m0.008s
$ time uvozovky_c < /var/log/messages > /dev/null
real	0m0.071s
user	0m0.059s
sys	0m0.005s
Muzete si vsimnout, ze reseni v Perl'u je dokonce rychlejsi nez v C.
1.12.2005 13:34 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Obávám se, že vaše měření je něčím zkresleno. Zkoušel jsem si to na asi 5 MB vstupu a vychází mi přibližně 435 ms pro Perl a 155 ms pro C, což vypadá podstatně věrohodněji. Nezapomněl jste na optimalizace?
1.12.2005 14:12 alex
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Mereni muze byt velice jednoduse zkresleno jeste tim, jestli uvazujeme prvni start programu nebo nasledujici (cache).
[~]$ gcc -o uvozovky_c uvozovky.c -O2
[~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null

real	0m4.195s
user	0m3.174s
sys	0m0.201s
[~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null

real	0m3.492s
user	0m3.112s
sys	0m0.132s
[~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null

real	0m3.250s
user	0m3.079s
sys	0m0.132s
[~]$ time ./uvozovky_c < /usr/src/linux-2.6.14.2.tar.bz2  > /dev/null

real	0m3.301s
user	0m3.098s
sys	0m0.137s
Podobne,
[~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null

real	0m2.278s
user	0m1.806s
sys	0m0.154s
[~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null

real	0m2.003s
user	0m1.807s
sys	0m0.154s
[~]$ time perl -pe 's/".*?"/($s=$&)=~s: :_:g;$s/eg' /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null

real	0m2.004s
user	0m1.814s
sys	0m0.152s
Samozrejme, prvni start Perlu muze byt i pomalejsi nez C, tady mu pomohlo to, ze ja jsem meril rychlost perlu az po c-ku. Neni nic divneho na tom, ze Perl muze byt rychlejsi nez C. Vzlast kdyz si uvedomite, ze pouzivate getchar() misto operaci cteni celeho bloku.
1.12.2005 14:33 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Samozřejmě jsem používal průměr druhého až čtvrtého běhu programu, nejsem tak hloupý, jak vypadám. Perl v tomto případě není rychlejší než C, protože už z principu, kterým to děláte (vyhledávání regulárního výrazu) dost dobře ani nemůže. Takže tvrdím, že někde děláte chybu, pravděpodobně v těch optimalizacích.

Vzlast kdyz si uvedomite, ze pouzivate getchar() misto operaci cteni celeho bloku.

Zapomínáte na to, že streamové operace v libc mají vlastní bufferování, takže vkládat tam ještě druhý buffer by bylo zbytečné a program by to naopak zpomalilo. Není tam ani overhead na volání getchar(), protože to je ve skutečnosti makro. Samozřejmě by šel program trochu zrychlit načítáním celých bloků pomocí read() a jejich zápisem pomocí write(), pak by Perl neměl nejmenší šanci, ale to už by bylo na úkor přehlednosti.

1.12.2005 15:10 alex
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Samozřejmě jsem používal průměr druhého až čtvrtého běhu programu, nejsem tak hloupý, jak vypadám.
Nevypadate vubec hloupe, vase prispevky tady a na cz.comp.linux vzdy povazuji za velice duveryhodne. Ale stava se, ze i mistr tesar se utne, takze jsem nevedel, jestli jste nahodou nezapomel na ten cache.
Takže tvrdím, že někde děláte chybu, pravděpodobně v těch optimalizacích.
V minulem prispevku jsem uvedl prikaz, pomoci ktereho to prekladam. Optimalizaci mam nastavenou na level 2. Jak to mate vy?
Zapomínáte na to, že streamové operace v libc mají vlastní bufferování, takže vkládat tam ještě druhý buffer by bylo zbytečné a program by to naopak zpomalilo.
Plny souhlas.
Samozřejmě by šel program trochu zrychlit načítáním celých bloků pomocí read() a jejich zápisem pomocí write(), pak by Perl neměl nejmenší šanci, ale to už by bylo na úkor přehlednosti.
Tak tady nesouhlasim s tim, ze by to zrychlilo program jen trochu.
[~]$ cat uvozovky_read_write.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFSIZE 512

int main()
{
    char *buf_in = malloc(BUFSIZE);
    char *buf_out = malloc(BUFSIZE);
    char c;
    int  i, j, n;
    int inside = 0;

    j = 0;
    while (n = read(0, buf_in, BUFSIZE)) {
      for (i = 0; i < n; i++) {
	      c = buf_in[i];
	      switch (c) {
		      case '\n': inside = 0; break;
		      case '"' : inside = !inside; break;
		      case ' ' : c = inside ? '_' : ' ';
	      }
	      buf_out[j++] = c;
	      if ( j >= BUFSIZE ) {
		      write(1, buf_out, BUFSIZE);
		      j = 0;
	      }
      }
    }
    if ( j ) {
	    write(1, buf_out, j);
    }

    return 0;
}
[~]$ gcc -O2 -o uvozovky_read_write uvozovky_read_write.c
[~]$ time ./uvozovky_read_write < /usr/src/linux-2.6.14.2.tar.bz2 > /dev/null

real	0m0.641s
user	0m0.326s
sys	0m0.202s
A skutecne Perl nema sanci.
1.12.2005 15:28 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Používal jsem '-O3 -fomit-frame-pointer' plus optimalizaci pro procesor. Co se týká přechodu na 'read()' a 'write()', skutečně jsem ho hodně podcenil, rozdíl je v některých případech i řádový. Zdá se, že režie streamových funkcí v glibc je větší, než jsem si pod vlivem dřívějších testů myslel.
1.12.2005 20:13 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Zdá se, že režie streamových funkcí v glibc je větší, než jsem si pod vlivem dřívějších testů myslel.
Dost velký čas sežere zbytečné zamykání, při použítí getchar_unlocked() a putchar_unlocked() se to celkem zrychlí.
1.12.2005 20:36 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Díky za upozornění, hlavně že zrovna včera jsem několik hodin strávil studiem chování glibc vůči multithreadovým aplikacím…
1.12.2005 16:13 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Hmm, tak koukám, že tady je to samý C expert, aneb jak napsat co nejméně efektivní memcpy. Co třeba takhle?:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFSIZE 65536

int main()
{
    char *buf = malloc(BUFSIZE);
    char *c, *end;
    int n;
    int inside = 0;

    while (n = read(0, buf, BUFSIZE)) {
        end = buf+n;
        for (c = buf; c < end; c++) {
            switch (*c) {
                case '\n': inside = 0; break;
                case '"' : inside = !inside; break;
                case ' ' : if (inside) *c ='_';
            }
        }
        write(1, buf, n);
    }

    return 0;
}
Proč ty data přesýpat z jednoho místa na druhé fakt nechápu.
$ time ./uvozovky_read_write </var/cache/apt/archives/openclipart-png_0.17+dfsg-1_all.deb >/dev/null

real    0m1.716s
user    0m0.580s
sys     0m0.270s
$ time ./uvozovky_read_write_orig </var/cache/apt/archives/openclipart-png_0.17+dfsg-1_all.deb >/dev/null

real    0m1.926s
user    0m0.800s
sys     0m0.340s
Krom toho ten půlkylovej buffer byl fakt dobrej vtip. Vůbec vám nevadí, že tráví v kernelu skoro stejně dlouhej čas jako v userspace? Ten uvozovky_read_write_orig má samozřejmě zvětšenej buffer taky, jinak by měl něco kolem 600ms v kernelspace. Toho času real si nevšímejte, nejsem na tom App Serveru sám :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
1.12.2005 16:53 alex
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Tady uz neslo o nejefektivnejsi program v C. Slo o to, porovnat rychlost getchar() versus read(). Spravne jste poukazal na spoustu nedokonalosti, ale vsimnete si, ze po tech upravach cas se zkratil na 10%, kdyzto pri prechodu od getchar k read rozdil byl 5-nasobny. To prave vysvetluje, proc Perl s jeho pomalym regexpem muze byt skoro stejne rychly jako ten prvni program v C - vsechno sezere rezie vstupu/vystupu.
1.12.2005 17:27 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Však doufám, že jsem se někoho nedotknul :-D
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
1.12.2005 17:36 alex
Rozbalit Rozbalit vše Re: Nahrazeni mezer znakem
Ale ne, jste vseobecne uznavan jako Velky Optimizator :-)

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.