#! /usr/bin/perl # mittelt mehrere Spektren einer Datei # Erstes Spektrum ist SPEKTRUMNUMMER # gemittelt wird ueber ANZAHL folgende Spektren # HOWTO: ./avg.pl DATEI SPEKTRUMNUMMER ANZAHL use strict; use warnings; use Term::ANSIColor qw(:constants); if(!defined $ARGV[0]){ printf "\nAus welcher Datei soll gemittelt werden?\n"; $ARGV[0] = ; chomp $ARGV[0]; } if(!defined $ARGV[1]){ printf "\nWelcher Spektrenblock soll gemittelt werden?\n"; printf BLUE "Anfang:\t"; printf CLEAR; $ARGV[1] = ; chomp $ARGV[1]; } if(!defined $ARGV[2]){ printf "\nUeber wieviele Spektren sollen gemittelt werden?\n"; printf BLUE"Anzahl:\t"; printf CLEAR; $ARGV[2] = ; chomp $ARGV[2]; } my $file = $ARGV[0]; my $anfang = $ARGV[1]; my $ende = $ARGV[1] + $ARGV[2]; my ($in,$suffix) = $ARGV[0] =~ /(.*?)(\.[^\.]+)$/; my $out = $in.'.avg'.$ende.'.dat'; open(my $daten,"<",$file) or die $!; open(my $avg,">",$out) or die $!; my $data; my $block = 0; my %set; my $set_cnt = 0; while(do {local $/="\n\n\n";defined($data = <$daten>)}){ chomp $data; if($block > $anfang && $block < $ende){ my ($n, @m) = split (/\s+/,$data); $set{$n}->[$_] += $m[$_] for 0 .. $#m; $set_cnt++; } $block++; } foreach my $k (sort { $a <=> $b } keys %set) { print $avg $k, "\t"; print $avg $_/$set_cnt, "\t" for @{$set{$k}}; print $avg "\n"; } close $avg; close $file;