Portál AbcLinuxu, 13. července 2025 21:00


Dotaz: skript v bashi

7.11.2011 16:22 tgm126
skript v bashi
Přečteno: 540×
Odpovědět | Admin
Dobrý den,

řeším následující problém: Periodicky načítám z db sadu hodnot (select z jedné tabulky). Některé hodnoty jsou kumulativní - potřebuji tedy při jejich zpracování od aktuální hodnoty odečíst hodnotu z předchozího měření. Použití db je vyloučeno - hodnoty je nutno uchovat v souboru.

Nenapádá prosím někoho způsob jak to v bashi udělat?

Dík

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.11.2011 16:39 l4m4
Rozbalit Rozbalit vše Re: skript v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co udělat? Odečíst čísla ($[a-b])? Zapsat něco do souboru (echo $x >soubor)? Přečíst něco ze souboru (x=$(<soubor))? ???
7.11.2011 17:02 tgm126
Rozbalit Rozbalit vše Re: skript v bashi
Dík moc za rady, rád jsem se poučil (v bashi jsem nikdy nedělal - potřebuji pouze rychle jednorázový skript). Mohl bys prosím svoji odpověď trochu rozvést? Vstupem jsou tyto struktury:
hodnota1:   1
hodnota2:   2
...
hodnota200: 200
nebo mohou být hodnoty na jednom řádku oddělené čárkou.

Dá se to nějak elegantněji vyřešit aniž bych zaváděl 200 proměnných?

Díky za trpělivost.
Tarmaq avatar 7.11.2011 17:24 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: skript v bashi
mohl bys uvest nejaky konkretni priklad treba na trech hodnotach + jaky ma byt vystup? nejak z tohoto prikladu nechapu co s cim se ma scitat..
Don't panic!
7.11.2011 23:38 tgm126
Rozbalit Rozbalit vše Re: skript v bashi
- získám z db sadu hodnot - uložím do souboru buď do jednoho řádku nebo pod sebe viz výše (např. 1234,3456,5678,.......) - po čase získám další sadu dat (např. 1235,3457,5679,.......) potřebuji od aktuálních hodnot odečíst ty uložené a výsledek si zapsat (chci tedy získat 1,1,1,.....)
8.11.2011 15:56 Ash | skóre: 53
Rozbalit Rozbalit vše Re: skript v bashi
Procházet současně dva soubory (starý a nový) není pro bash ideální úkol, můžete je ale projít sekvenčně a místo zavádění 200 proměnných zavést pole (ne že by v tom byl velký rozdíl).
#!/bin/bash

declare -a arr;

i=0;
while read label value; do
  echo "$label|$value";
  arr[i]=$value;
  ((i++));
done < <(sed -e "s/,/\n/g" old.txt)

i=0;
while read label value; do
  echo "$label|$value";
  echo "$value - ${arr[$i]}";
  arr[i]=$((value - arr[i]));
  echo "${arr[i]}";
  ((i++));
done < <(sed -e "s/,/\n/g" new.txt)
8.11.2011 15:58 Ash | skóre: 53
Rozbalit Rozbalit vše Re: skript v bashi
Pokud by vstupy byly nějaké proměnlivé, ne jen 200 po sobě jdoucích vždy stejně seřazených proměnných, lze použít i asociativní pole (název proměnné jako klíč).
9.11.2011 11:21 tgm126
Rozbalit Rozbalit vše Re: skript v bashi
Dík, to je to, co jsem hledal :)
rADOn avatar 7.11.2011 18:39 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: skript v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
jestli tomu dobre rozumim, potrebujes awk skript. V BEGIN sekci si nactes jeden vstupni soubor do asociativniho pole. Pres druhy vstupni soubor (data z db) pak budes iterovat a pricitat je k tomu co uz mas v asoc. poli. V END sekci pripadne muzes poresit polozky ktere pribyly/ubyly.

Pokud by se data nevesly do pameti, budes muset obe sady zapsat na disk, prohnat sortem a zpracovat paralelelne, coz uz je kapku slozitejsi…

"2^24 comments ought to be enough for anyone" -- CmdrTaco
7.11.2011 19:42 Kit
Rozbalit Rozbalit vše Re: skript v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vylučování DB je krátkozraké. DB není jen MySQL. Je spousta jiných DB, které by se pro tento účel hodily. Naopak bych raději vyloučil uchování v běžném souboru kvůli ACID. Výběr je skutečně velmi široký.

Pokud bude skript běžet trvale, je možné použít 2 asociativní pole v paměti shellu. Jedno pro staré výsledky, druhé pro nové. V Bashi to sice nebude extra rychlé, ale pokud to není náročná aplikace, pojede to dobře. V Perlu nebo PHP to může být ještě lepší, ale pro 200 proměnných by to mohl být kanón na vrabce.
martin-ux avatar 8.11.2011 12:49 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: skript v bashi
Odpovědět | | Sbalit | Link | Blokovat | Admin
osobne by som toto riesil v perl-e .. taky rychly dirty-style script by mohol vyzerat:
#!/usr/bin/perl -w

use warnings;
use strict;

my @db = ();
while (<>) {
        push @db, [ split('[\t\n,]') ];
}

my ($dim, $i,$j);
$dim = @{$db[0]};

for $i (0 .. $#db-1 ) {
        for ($j =0; $j < $dim; $j++) {
                print $db[$i+1][$j] - $db[$i][$j] . ',';
        }
        print "\n";
}
vstupne data:
$ cat test.in
5,1,6,1,6,4,9
4,1,6,8,2,1,7
7,9,2,3,6,1,6
2,2,1,5,7,2,5
$
a samotny vystup:
$ ./output.pl test.in
-1,0,0,7,-4,-3,-2,
3,8,-4,-5,4,0,-1,
-5,-7,-1,2,1,1,-1,
$
script odpocitava n+1 riadok od n teho. dirty-style preto, lebo vstup, velkost vektorov (pocet cisel v riadku) nie je kontrolovany ..

ukazuje princip, ako by si to mohol spravit. (jj, v perle, nie v bashi).

..when you do things right, people won't be sure you've done anything at all..

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.