/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Gruppere og tage gennemsnit
Fra : JoeDoe


Dato : 28-09-09 23:57

Jeg havde allerførst tiltænkt denne post kun til regnearks-gruppen men
her på det sidste har jeg haft gode erfarninger med at køre det ind
over Unix gruppen og få min Linux server til at håndtere det
besværlige Men det ér et ekstra step at tage, så hvis det nu kan
lade sig gøre i Excel 2003 ville det være det optimale.

Lad os sige, at jeg har følgende kommasep. fil som jeg kan importere i
Excel (eller til en tekstfil i Linux):

Site, Server, Uptime
Site1, Srv1, 99.2
Site1, Srv2, 99.4
Site2, SrvX, 0
Site3, Srv1, 100
Site3, SrvX, 99

Jeg vil gerne have dette output (enten i Excel 2003 eller vha. Linux):

Site, Uptime
Site1, 99.3
Site2, 0
Site3, 99.5

Denne liste består af tusindvis af servere som alle gerne må gruppéres
efter hvilket site de er på samt skal gennemsnittet for deres oppetid
findes.

Er der en måde at løse denne opgave på? Bemærk at udfordringen består
i at gøre dette per automatik, da jeg selvfølgelig kunne gøre dette
manuelt men mon ikke det vil tage det meste af en uge?

Den forkromede udgave er, at jeg også har internet forbindelsen til
sitet. Inputtet kunne f.eks. se sådan her ud (hvor jeg har en "Inet"
på alle sites):

Site, Server, Uptime
Site1, Srv1, 99.2
Site1, Srv2, 99.4
Site1, Inet, 100
Site2, SrvX, 0
Site2, Inet, 0
Site3, Srv1, 100
Site3, Inet, 100
Site3, SrvX, 99

... hvor outputtet så kunne vise forbindelsen via internettet i en
selvstændig kolonne - f.eks.:

Site, Uptime, Inet
Site1, 99.3, 100
Site2, 0, 0
Site3, 99.5, 100

Men det er den forkromede Jeg kan "nøjes" med den første løsning,
hvis dette overhovedet er muligt.

 
 
Peter Dalgaard (29-09-2009)
Kommentar
Fra : Peter Dalgaard


Dato : 29-09-09 07:58

On Mon, 28 Sep 2009 22:57:22 -0700, JoeDoe wrote:

> Site, Server, Uptime
> Site1, Srv1, 99.2
> Site1, Srv2, 99.4
> Site2, SrvX, 0
> Site3, Srv1, 100
> Site3, SrvX, 99

Der er et "lille" statistikprogram der hedder R, som findes til Windows og
som standardpakke på de større linuxer. I det kan man sådan noget som

> x <- read.csv("clipboard")
> x
Site Server Uptime
1 Site1 Srv1 99.2
2 Site1 Srv2 99.4
3 Site2 SrvX 0.0
4 Site3 Srv1 100.0
5 Site3 SrvX 99.0
> aggregate(x["Uptime"],x["Site"],mean)
Site Uptime
1 Site1 99.3
2 Site2 0.0
3 Site3 99.5

Den anden er lidt mere kringlet. Jeg ville nok starte med

> x <- read.csv("clipboard")
> x
Site Server Uptime
1 Site1 Srv1 99.2
2 Site1 Srv2 99.4
3 Site1 Inet 100.0
4 Site2 SrvX 0.0
5 Site2 Inet 0.0
6 Site3 Srv1 100.0
7 Site3 Inet 100.0
8 Site3 SrvX 99.0
> x$Inet <- x$Server==" Inet" ## NB: Leading space...
> aggregate(x["Uptime"],x[c("Inet", "Site")],mean)
Inet Site Uptime
1 FALSE Site1 99.3
2 TRUE Site1 100.0
3 FALSE Site2 0.0
4 TRUE Site2 0.0
5 FALSE Site3 99.5
6 TRUE Site3 100.0

Eller, for at få en linje per site:

> s <- aggregate(x["Uptime"],x[c("Inet", "Site")],mean)
> reshape(s, direction="wide", timevar="Inet", idvar="Site")
Site Uptime.FALSE Uptime.TRUE
1 Site1 99.3 100
3 Site2 0.0 0
5 Site3 99.5 100

eller evt. noget med at dele op i to efter Inet ja/nej og merge()
resultaterne sammen.

--
O__ ---- Peter Dalgaard Øster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk) FAX: (+45) 35327907

Peter Makholm (29-09-2009)
Kommentar
Fra : Peter Makholm


Dato : 29-09-09 08:09

JoeDoe <joedoe10@gmail.com> writes:

> Lad os sige, at jeg har følgende kommasep. fil som jeg kan importere i
> Excel (eller til en tekstfil i Linux):

Det virker til at være en rimelig triviel opgave for de fleste
scriptingsprog:

#!/usr/bin/perl

use 5.10.0;
use strict;
use warnings;

my %sites; # Hash of arryrefs of uptime data

$_ = <>; # Drop first line
while(<>) {
next unless $_; # Ignore empty lines

my ($site, $server, $uptime) = split /,\s*/, $_;
push @{ $sites{ $site } }, $uptime;
}

say "Site, Uptime";
for my $site (sort keys %sites) {
my ($sum, $n, $avg);

$sum += $_ for @{ $sites{ $site } };
$n = scalar( @{ $sites{ $site } } );
$avg = $sum/$n;

say "$site, $avg";
}

__END__

Dette er let at udvide til at kunne beregne gennemsnit over to
kolonner. Enten ved at bruge en hash til hvor kolonne (lettest) eller
ved at gemme begge datapunkter i en arrayrref istedet for bare
uptime-værdien.

Hvis du vil løse denne slags opgaver under linux kan jeg stærkt
anbefale at du lære at programmere i et af de udbredte scriptingsporg:
Perl, Python eller Ruby.

For Perl kan jeg anbefale bogen 'Learning Perl' af Schwartz, Phoenix
og Brian D Foy. Men sørg for at få fat i femte udgave.

//Makholm

Hans Knudsen (29-09-2009)
Kommentar
Fra : Hans Knudsen


Dato : 29-09-09 08:21

Oversæt venligst selv, hvis du bruger dansk Excel.
Jeg forudsætter du har dine data i A2:A6.

Marker A2:A6, tryk på Data, Text to Columns, Delimited, Next, flueben ved
Space, Next, marker Server kolonnen, sæt prik ved Do not import column og
tryk på Finish.
Marker B2:B6. TTryk på Edit, Replace. Punktum i Find What, komma i Replace
with, tryk Replace All, OK, Close.
I en tom celle indtast følgende matriksformel:
=AVERAGE(IF($A$2:$A$6="Site1,";$B$2:$B$6)) for at få Site1 gennemsnit osv.

Du ved vel, at matriksformler skal indtastes ved at holde Ctrl og Shift nede
medens du trykker på Enter, altså en tre-tast kombination, hvorved Excel
automatisk omslutter formlen med tuborgparenteser {}.

Hans




"JoeDoe" <joedoe10@gmail.com> wrote in message
news:c089cb48-5fc5-471a-819b-2fe56c0d2a5d@e8g2000yqo.googlegroups.com...
Jeg havde allerførst tiltænkt denne post kun til regnearks-gruppen men
her på det sidste har jeg haft gode erfarninger med at køre det ind
over Unix gruppen og få min Linux server til at håndtere det
besværlige Men det ér et ekstra step at tage, så hvis det nu kan
lade sig gøre i Excel 2003 ville det være det optimale.

Lad os sige, at jeg har følgende kommasep. fil som jeg kan importere i
Excel (eller til en tekstfil i Linux):

Site, Server, Uptime
Site1, Srv1, 99.2
Site1, Srv2, 99.4
Site2, SrvX, 0
Site3, Srv1, 100
Site3, SrvX, 99

Jeg vil gerne have dette output (enten i Excel 2003 eller vha. Linux):

Site, Uptime
Site1, 99.3
Site2, 0
Site3, 99.5

Denne liste består af tusindvis af servere som alle gerne må gruppéres
efter hvilket site de er på samt skal gennemsnittet for deres oppetid
findes.

Er der en måde at løse denne opgave på? Bemærk at udfordringen består
i at gøre dette per automatik, da jeg selvfølgelig kunne gøre dette
manuelt men mon ikke det vil tage det meste af en uge?

Den forkromede udgave er, at jeg også har internet forbindelsen til
sitet. Inputtet kunne f.eks. se sådan her ud (hvor jeg har en "Inet"
på alle sites):

Site, Server, Uptime
Site1, Srv1, 99.2
Site1, Srv2, 99.4
Site1, Inet, 100
Site2, SrvX, 0
Site2, Inet, 0
Site3, Srv1, 100
Site3, Inet, 100
Site3, SrvX, 99

... hvor outputtet så kunne vise forbindelsen via internettet i en
selvstændig kolonne - f.eks.:

Site, Uptime, Inet
Site1, 99.3, 100
Site2, 0, 0
Site3, 99.5, 100

Men det er den forkromede Jeg kan "nøjes" med den første løsning,
hvis dette overhovedet er muligt.


JoeDoe (29-09-2009)
Kommentar
Fra : JoeDoe


Dato : 29-09-09 03:16

> > Lad os sige, at jeg har følgende kommasep. fil som jeg kan importere i
> > Excel (eller til en tekstfil i Linux):
>
> Det virker til at være en rimelig triviel opgave for de fleste
> scriptingsprog:
>
> #!/usr/bin/perl
[CUT]

Hvis muligt ville jeg foretrække standard kommandoer i Linux - grep,
awk osv. fremfor Perl, som jeg ikke er gode venner med. Der er nok at
lære og endnu et scriptsprog står ikke højt på min TODO i den nærmeste
fremtid

> my %sites; # Hash of arryrefs of uptime data
>
> $_ = <>; # Drop first line
> while(<>) {
>     next unless $_; # Ignore empty lines
>
>     my ($site, $server, $uptime) = split /,\s*/, $_;
>     push @{ $sites{ $site } }, $uptime;
>
> }
[CUT]

Hvordan kaldes dette script? "cat csvfile | perscript.pl" eller .. ?

> Hvis du vil løse denne slags opgaver under linux kan jeg stærkt
> anbefale at du lære at programmere i et af de udbredte scriptingsporg:
> Perl, Python eller Ruby.

Hvad er der nu galt med de indbyggede programmer?

JoeDoe (29-09-2009)
Kommentar
Fra : JoeDoe


Dato : 29-09-09 03:18

> I en tom celle indtast følgende matriksformel:
> =AVERAGE(IF($A$2:$A$6="Site1,";$B$2:$B$6)) for at få Site1 gennemsnit osv.
>
> Du ved vel, at matriksformler skal indtastes ved at holde Ctrl og Shift nede
> medens du trykker på Enter, altså en tre-tast kombination, hvorved Excel
> automatisk omslutter formlen med tuborgparenteser {}.

Hvis jeg manuelt skal indtaste "Site1", "Site2" osv i IF-statements er
der vel ikke meget automatik i dette? Eller har jeg misforstået det?

Hans Knudsen (29-09-2009)
Kommentar
Fra : Hans Knudsen


Dato : 29-09-09 12:54

For eksempel:
Tag en kopi af den kolonne hvor du har Site stående (A i mit eksempel) og
sæt ind i en blank kolonne. Benyt nu Avanceret filter til at lave en liste
over unique records, lad os sige at de står for eksempel i D1:D50. Hvis dit
dataområde går for eksempel fra A2:B1000 bliver formlen for Site1:
=AVERAGE(IF($A$2:$A$1000=D1,";$B$2:$B$1000)
Kopier formlen nedad.



"JoeDoe" <joedoe10@gmail.com> wrote in message
news:1fbeeb88-bdbf-4b87-a839-e4638c86a7f3@k17g2000yqb.googlegroups.com...
> I en tom celle indtast følgende matriksformel:
> =AVERAGE(IF($A$2:$A$6="Site1,";$B$2:$B$6)) for at få Site1 gennemsnit osv.
>
> Du ved vel, at matriksformler skal indtastes ved at holde Ctrl og Shift
> nede
> medens du trykker på Enter, altså en tre-tast kombination, hvorved Excel
> automatisk omslutter formlen med tuborgparenteser {}.

Hvis jeg manuelt skal indtaste "Site1", "Site2" osv i IF-statements er
der vel ikke meget automatik i dette? Eller har jeg misforstået det?


JoeDoe (29-09-2009)
Kommentar
Fra : JoeDoe


Dato : 29-09-09 03:27

> Der er et "lille" statistikprogram der hedder R, som findes til Windows og
> som standardpakke på de større linuxer. I det kan man sådan noget som

Mange tak, men jeg synes det er way overkill at skulle lære et 3.
parts program at kende (som jeg ikke synes ser specielt nemt ud) -
hvis ikke det kan lade sig gøre i almindelig Excel eller på Linux (med
normale kommandoer), så vil jeg hellere sige at det ikke kan lade sig
gøre

Kent Friis (29-09-2009)
Kommentar
Fra : Kent Friis


Dato : 29-09-09 15:40

Den Tue, 29 Sep 2009 02:27:01 -0700 (PDT) skrev JoeDoe:
>> Der er et "lille" statistikprogram der hedder R, som findes til Windows og
>> som standardpakke på de større linuxer. I det kan man sådan noget som
>
> Mange tak, men jeg synes det er way overkill at skulle lære et 3.
> parts program at kende (som jeg ikke synes ser specielt nemt ud) -
> hvis ikke det kan lade sig gøre i almindelig Excel eller på Linux (med
> normale kommandoer), så vil jeg hellere sige at det ikke kan lade sig
> gøre

Hvad er normale kommando'er?

Jeg ville have foreslået en SQL-DB, enten MySQL eller Sqlite.

Mvh
Kent
--
"The Brothers are History"

Peter Makholm (29-09-2009)
Kommentar
Fra : Peter Makholm


Dato : 29-09-09 10:38

JoeDoe <joedoe10@gmail.com> writes:

> Hvis muligt ville jeg foretrække standard kommandoer i Linux - grep,
> awk osv. fremfor Perl, som jeg ikke er gode venner med.

Jeg betragter perl som et standardværktøj. Efter min mening er et
basalt kendskab til perl mere nyttigt end awk og sed.

> Hvordan kaldes dette script? "cat csvfile | perscript.pl" eller .. ?

Det kan kaldes på flere måder. Hvis du har dine data i en eksisterende
fil ville jeg foretrække at sætte x-bitten på scriptet og skrive:

$ ./avgscript data.csv

men følgende virker også:

$ perl avgscript data.csv
$ ./avgscript < data.csv
$ cat data.csv | ./avgscript

Den sidste form vilel jeg kun bruge hvis dinne data var uddata fra et
andet program (og altså ikke cat). For eksempel hvis du hentede data
fra en webserver:

$ curl http://someserver/webservice/ | ./avgscript

>> Hvis du vil løse denne slags opgaver under linux kan jeg stærkt
>> anbefale at du lære at programmere i et af de udbredte scriptingsporg:
>> Perl, Python eller Ruby.
>
> Hvad er der nu galt med de indbyggede programmer?

Intet hvis man regner perl for et af de indbyggede programmer.

//Makholm

Harald Staff (30-09-2009)
Kommentar
Fra : Harald Staff


Dato : 30-09-09 00:12

En Pivot-tabell i Excel gjør dette, og mere.

HTH. Beste hilsen Harald


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste