|
| 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
| |
|
|