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í
×
    včera 17:33 | Pozvánky

    Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 211. sraz, který proběhne v pátek 19. září od 18:00 ve Studentském klubu U Kachničky na Fakultě informačních technologií Vysokého učení technického na adrese Božetěchova 2/1. Na srazu proběhne přednáška Jiřího Eischmanna o nové verzi prostředí GNOME 49. Nemáte-li možnost se zúčastnit osobně, přednáškový blok bude opět streamován živě na server VHSky.cz a následně i zpřístupněn záznam.

    Ladislav Hagara | Komentářů: 0
    včera 01:33 | IT novinky

    Microsoft se vyhnul pokutě od Evropské komise za zneužívání svého dominantního postavení na trhu v souvislosti s aplikací Teams. S komisí se dohodl na závazcích, které slíbil splnit. Unijní exekutivě se nelíbilo, že firma svazuje svůj nástroj pro chatování a videohovory Teams se sadou kancelářských programů Office. Microsoft nyní slíbil jasné oddělení aplikace od kancelářských nástrojů, jako jsou Word, Excel a Outlook. Na Microsoft si

    … více »
    Ladislav Hagara | Komentářů: 3
    12.9. 14:00 | Nová verze

    Samba (Wikipedie), svobodná implementace SMB a Active Directory, byla vydána ve verzi 4.23.0. Počínaje verzí Samba 4.23 jsou unixová rozšíření SMB3 ve výchozím nastavení povolena. Přidána byla podpora SMB3 přes QUIC. Nová utilita smb_prometheus_endpoint exportuje metriky ve formátu Prometheus.

    Ladislav Hagara | Komentářů: 0
    12.9. 12:00 | Zajímavý článek

    Správcovský tým repozitáře F-Droid pro Android sdílí doporučení, jak řešit žádosti o odstranění nelegálního obsahu. Základem je mít nastavené formální procesy, vyhrazenou e-mailovou adresu a být transparentní. Zdůrazňují také důležitost volby jurisdikce (F-Droid je v Nizozemsku).

    🇵🇸 | Komentářů: 20
    12.9. 05:33 | Bezpečnostní upozornění

    Byly publikovány informace o další zranitelnosti v procesorech. Nejnovější zranitelnost byla pojmenována VMScape (CVE-2025-40300, GitHub) a v upstream Linuxech je již opravena. Jedná se o variantu Spectre. KVM host může číst data z uživatelského prostoru hypervizoru, např. QEMU.

    Ladislav Hagara | Komentářů: 0
    11.9. 22:00 | Komunita

    V červenci loňského roku organizace Apache Software Foundation (ASF) oznámila, že se částečně přestane dopouštět kulturní apropriace a změní své logo. Dnes bylo nové logo představeno. "Indiánské pírko" bylo nahrazeno dubovým listem a text Apache Software Foundation zkratkou ASF. Slovo Apache se bude "zatím" dál používat. Oficiální název organizace zůstává Apache Software Foundation, stejně jako názvy projektů, například Apache HTTP Server.

    Ladislav Hagara | Komentářů: 14
    11.9. 17:33 | Nová verze

    Byla vydána (𝕏) srpnová aktualizace aneb nová verze 1.104 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.104 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 1
    11.9. 15:33 | IT novinky

    Spotify spustilo přehrávání v bezztrátové kvalitě. V předplatném Spotify Premium.

    Ladislav Hagara | Komentářů: 0
    11.9. 15:00 | IT novinky

    Spoluzakladatel a předseda správní rady americké softwarové společnosti Oracle Larry Ellison vystřídal spoluzakladatele automobilky Tesla a dalších firem Elona Muska na postu nejbohatšího člověka světa. Hodnota Ellisonova majetku díky dnešnímu prudkému posílení ceny akcií Oraclu odpoledne vykazovala nárůst o více než 100 miliard dolarů a dosáhla 393 miliard USD (zhruba 8,2 bilionu Kč). Hodnota Muskova majetku činila zhruba 385 miliard dolarů.

    Ladislav Hagara | Komentářů: 7
    10.9. 21:22 | Nová verze

    Bylo vydáno Eclipse IDE 2025-09 aneb Eclipse 4.37. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.

    Ladislav Hagara | Komentářů: 0
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (82%)
     (6%)
     (3%)
     (3%)
     (4%)
     (2%)
    Celkem 171 hlasů
     Komentářů: 12, poslední 10.9. 13:00
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Dotaz: Bash: Najít v souboru čísla a zaokrouhlit je

    18.2.2017 15:55 michal
    Bash: Najít v souboru čísla a zaokrouhlit je
    Přečteno: 775×
    Jak najít v souboru (plain text) všechna čísla s desetinnou čárkou a zaokrouhlit je na celá čísla ?

    Příklad - původní soubor:
    abcd 123,9
    efg klmnopr
    hbdsg 468
    nnnn mmmmmm
    95,4 ssssss

    Požadovaný výsledný soubor:
    abcd 124
    efg klmnopr
    hbdsg 468
    nnnn mmmmmm
    95 ssssss

    Odpovědi

    wamba avatar 18.2.2017 16:44 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Třeba:
    perl -Mlocale -pe 's/(\d+[,]\d+)/sprintf "%.0f", $1/ge'  puvodni_soubor.txt > vysledny_soubor.txt
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    18.2.2017 18:54 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Funguje dobře, ale Perl vidím prvně v životě.

    Rači bych awk nebo sed, které mi do bash scriptu přece jen lépe zapadají. Nicméně s nimi se mi to vyřešit nepodařilo.

    18.2.2017 20:55 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Tohle by nešlo?

    sed -r 's/([0-9]+,[0-9]+)/printf %0.f \1/ge' file.txt
    18.2.2017 21:25 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    ok, tak jednoduché to být nemůže, budu nad tím ještě dumat
    18.2.2017 22:26 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Jasně, že to tak být nemůže. Je tam plno chybových hlášení.
    18.2.2017 22:22 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Tak takhle, pokud ten soubor není moc velkej, protože je to docela pomalé. Jiná cesta pomocí sed nejspíš není a pro awk mi jednoduché řešení nenapadá. Perl bude podstatně rychlejší.

    sed -r ":a;s/(.*)([0-9]+,[0-9]+)([^0-9]*)/printf '%s%0.f%s' '\1' '\2' '\3'/e; ta" /tmp/sedtest.txt
    18.2.2017 22:36 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Zase chybová hlášení ....

    Funguje bohužel jenom ten Perl, ale ani to není ideální. Zaokrouhlená čísla jsou kratší. Zmizí čárka a desetinné místo. Proto je třeba přidat před každé zaokrouhlené číslo dvě mezery, jenže já ten Perl neumím změnit.
    18.2.2017 22:43 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    možná nemáte GNU verzi sedu nebo jinou, která podporuje modifikátor e
    wamba avatar 19.2.2017 08:56 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Funguje bohužel jenom ten Perl, ale ani to není ideální. Zaokrouhlená čísla jsou kratší. Zmizí čárka a desetinné místo. Proto je třeba přidat před každé zaokrouhlené číslo dvě mezery, jenže já ten Perl neumím změnit.
    Pokud skutečně stačí přidat jen dvě mezery, tak se jednoduše přidají do formátovacího řetězce v sprintf: " %.0f".

    Perl-u není třeba se bát.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    19.2.2017 10:04 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je

    Dá se to vyřešit i obecněji, bez spoléhání na konkrétní počet desetinných míst. Ne nutně v Perlu a ne nutně one-linerem. ;-)

    wamba avatar 19.2.2017 14:11 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Pomocí Perlu by to šlo například následovně
    perl  -pe 's/(\d+)[,](\d+)/sprintf " " x length($2) . " %.0f", "$1.$2"/ge'  puvodni_sobor.txt
    
    Otázka je jestli zrovna tohle zobecnění bude užitečné. Takových zobecnění se dá vymyslet spousta. Mě například napadlo, že pokud tisíce jsou odělěny mezerou, tak jednak ty mezery nadělají neplechu uprostřed čísla a jednak číslo jako 1 999,50 nedopadne při zaokrouhlování podle předpokladů. :)

    Ale nač řešit problém tam, kde nemusí být. Nepřepokládám, že se snaží napsat nějaký univerzální nástroj, ale řeší jednorázovou záležitost.
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    19.2.2017 14:45 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    jj, není nad to, když se pro jednu čárku napíše dvacet řádků kódu ;). Komu vadí [s]printf verze, může na to jít přes matematickou funkci. Bude třeba nainstalovat modul Math::Round pomocí cpan:

    perl -MMath::Round -pe 's/(\d+),(\d+)/round("$1.$2")/eg' file.txt
    wamba avatar 19.2.2017 15:01 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Tak lze i, podobně jak má on, namísto round použít int "$1.$2"+.5. Ale díky tomu, že tam potom chtěl vložit mezery, tak se ukázalo použití sprintf jako prozřetelný krok :)
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    19.2.2017 15:30 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Požadavek na mezery jsem ignoroval, ale proč tedy mezery nedodat rovnou substitucí:

    /(" " x length $2).round("$1.$2")/

    nebo stejně při oříznutí pomocí int:

    /(" " x length $2).int "$1.$2"+.5/
    19.2.2017 14:28 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Dík wamba, mezery fungují.

    Ještě prosím něco. Existuje pro tvůj Perl - kód řešení in place, tedy něco jako i v sedu ? Prostě, změny udělat rovnou v jednom vstupnim souboru.
    wamba avatar 19.2.2017 14:40 wamba | skóre: 38 | blog: wamba
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    ano, překvapivě -i :), funguje i -i.bak podobně jako v Sedu.
    perl -i.bak -pe '...' soubor.txt
    This would have been so hard to fix when you don't know that there is in fact an easy fix.
    19.2.2017 19:18 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Výsledné finální řešení funguje správně a na jeden řádek. Takže díky. Definitivně vyřešeno.
    18.2.2017 22:33 RM
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Ještě malá úprava ([^0-9]*)/ zaměnit za (.*)/
    18.2.2017 22:43 michal
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Chybová hlášení ....

    Začínám raději studovat Perl, zápis mi připomíná Céčko
    19.2.2017 10:06 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je

    awk taky připomíná C, jen je mnohem jednodušší. Tak snad bude tohle fungovat.

    19.2.2017 06:46 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Tohle by mohlo jít. Tedy přinejmenším z požadovaného vstupu v dotazu to vyrobí ten požadovaný výstup. :-)
    awk '{for (i = 1; i <= NF; ++i) {z = $i; gsub(/,/, ".", z); if (z + " " == z) $i = int(.5 + z)} print $0}' < vstup > výstup
    
    19.2.2017 10:02 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je

    Aha. Teprve teď jsem si všiml tohoto podivného upřesnění. To taky není problém. Stačí se v awk podívat, jak dlouhé je číslo před zaokrouhlením a po něm, a doplnit mezery. Laxní definice číselných literálů, kterou awk používá, shodou okolností přesně pasuje na tento typ problému. Proto se něco takového tak často vidí ve školních úlohách všeho druhu, že ano. ;-)

    awk '{for (i = 1; i <= NF; ++i) {a = b = $i; gsub(/,/, ".", b); if (b + " " == b) {b = int(.5 + b); d = length(a) - length(b); $i = ""; for (j = 0; j < d; ++j) $i = $i " "; $i = $i b}} print $0}' < vstup > výstup
    

    Protože mít tohle^^^ jako one-liner je už daleko za vepřovou hranicí, lépe to bude vypadat zformátované:

    awk '{
           for (i = 1; i <= NF; ++i) {
             a = b = $i
             gsub(/,/, ".", b)
             if (b + " " == b) {
               b = int(.5 + b)
               d = length(a) - length(b)
               $i = ""
               for (j = 0; j < d; ++j) $i = $i " "
               $i = $i b
             }
           }
           print $0
         }' < vstup > výstup
    

    Nebo jako samostatný spustitelný soubor se skriptem (nazvěme ho můj_hustý_skript.awk) takto:

    #!/usr/bin/awk -f
    
    {
      for (i = 1; i <= NF; ++i) {
        a = b = $i
        gsub(/,/, ".", b)
        if (b + " " == b) {
          b = int(.5 + b)
          d = length(a) - length(b)
          $i = ""
          for (j = 0; j < d; ++j) $i = $i " "
          $i = $i b
        }
      }
      print $0
    }
    

    Pak se to dá (po chmod +x můj_hustý_skript.awk) normálně spustit:

    ./můj_hustý_skript.awk < vstup > výstup
    19.2.2017 10:11 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je

    Tohle tedy pochopitelně bude zaokrouhlovat i řetězce obsahující desetinné tečky, které (v českém prostředí) třeba nemají představovat čísla. Je-li něco takového nežádoucí, dá se to ošetřit jednoduchou drobnou úpravou, kterou už bych „ponechal čtenáři za cvičení“, jak s oblibou psal (ne)jeden slavný profesor. Škoda, že nejsem slavný profesor.

    19.2.2017 10:15 Aleš Kapica | skóre: 52 | blog: kenyho_stesky | Ostrava
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Evidentně jsi nepochopil co je bash. Bash je primárně jakési lepidlo, určené k tomu, abys mohl používat malé, jednoúčelové utility. I když samozřejmě v něm to co chceš naprogramovat také lze.Pro práci s čísly se jinak používá bc.

    Pokud jde o tvůj požadavek, tak uvažuj logicky - bash pracuje s textem. Takže kontroluj jednotlivé řetězce na výskyt čárky, použij čárku jako oddělovač a na tu část za ní aplikuj jednoduchou podmínku - podle toho, na jakou přesnost chceš jít. Bude-li větší než tebou zvolená prahová hodnota, připočítáš k levé části 1, jinak to necháš být.
    Josef Kufner avatar 19.2.2017 15:06 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    Ušetříš si hromadu času, když na toto nepoužiješ bash — není na to stavěný.
    Hello world ! Segmentation fault (core dumped)
    19.2.2017 20:05 bash
    Rozbalit Rozbalit vše Re: Bash: Najít v souboru čísla a zaokrouhlit je
    #!/bin/bash
    
    awk '{for...  
    
    Proč ne? :-)

    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.