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í
×
15.10. 21:44 | IT novinky

V dubnu letošního roku byla hodnota Bitcoinu, decentralizované kryptoměny téměř 65 000 dolarů. V červnu hodnota klesla pod 30 000 dolarů. Aktuálně opět překonala 60 000 dolarů.

Ladislav Hagara | Komentářů: 37
15.10. 16:00 | Nová verze

Společnost PINE64 stojící za telefonem PinePhone, notebooky Pinebook a Pinebook Pro, IP kamerou PineCube, hodinkami PineTime, páječkou (pájecím perem) Pinecil, zdroji PinePower nebo RISC-V vývojovou deskou PineCone publikovala na svém blogu říjnový souhrn novinek (YouTube) a představila nový vylepšený PinePhone Pro.

Ladislav Hagara | Komentářů: 25
15.10. 15:44 | Komunita

Ubuntu 22.04 bude Jammy Jellyfish.

Ladislav Hagara | Komentářů: 3
15.10. 14:55 | Zajímavý software

Projekt Sysinternals, tj. technické informace, nástroje pro diagnostiku, monitorování a hledání chyb v Microsoft Windows, včera slavil 25 let. Při této příležitosti byl představen Sysinternals Sysmon pro Linux. Zdrojové kódy jsou k dispozici na GitHubu. Další informace v příspěvku na blogu Microsoft Tech Community.

Ladislav Hagara | Komentářů: 0
15.10. 08:00 | Nová verze

Správce sbírky a přehrávač hudby Strawberry, fork Clementine, duchovního nástupce původního Amaroku z KDE 3.x, dospěl k vydání 1.0.0. Používá Qt 6, doplňuje několik funkcí včetně podpory ALSA PCM zařízení a unikátní identifikace souborů ve sbírce.

Fluttershy, yay! | Komentářů: 0
14.10. 22:44 | Nová verze

Devuan (Wikipedie), fork Debianu bez systemd, byl vydán ve verzi 4.0. Jeho kódové jméno je Chimaera podle planetky 623. Přehled novinek v poznámkách k vydání. Devuan 4.0 je založen je na Debianu 11.1 Bullseye.

Ladislav Hagara | Komentářů: 10
14.10. 20:22 | Nová verze

Bylo vydáno Ubuntu 21.10 s kódovým názvem Impish Indri. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 24
14.10. 17:33 | Komunita

Vývojáři svobodného 3D softwaru Blender představili nejnovějšího firemního sponzora Blenderu. Je ním společnost Apple a úroveň sponzoringu je Patron, tj. minimálně 120 tisíc eur ročně.

Ladislav Hagara | Komentářů: 2
14.10. 13:11 | Komunita

Byl zveřejněn program konference OpenAlt 2021. Konference proběhne online o víkendu 6. a 7. listopadu. Pokud to protiepidemická opatření dovolí, po skončení hlavního programu proběhne offline část v restauracích v Brně, v Praze, …

Ladislav Hagara | Komentářů: 8
14.10. 13:00 | Nová verze

Byla vydána KDE Plasma 25th Anniversary Edition aneb desktopové prostředí KDE Plasma bylo vydáno ve verzi 5.23. Přehled novinek i s videem a se snímky obrazovky v oficiálním oznámení. Podrobný přehled v seznamu změn.

Ladislav Hagara | Komentářů: 1
Kolik monitorů (obrazovek) používáte současně?
 (50%)
 (34%)
 (14%)
 (1%)
Celkem 352 hlasů
 Komentářů: 28, poslední 16.10. 16:22
Rozcestník



Dotaz: Nahrazeni mezer znakem

30.11.2005 18:54 Andrew
Nahrazeni mezer znakem
Přečteno: 749×
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: 72 | 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: 72 | 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: 72 | 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: 72 | 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: 72 | 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.