2

sample.dat時間の経過とともに記録された、10 の異なるフィールドの実験値を含むファイルがあります。またはその他のシェル ツールを使用してsedawksample.data ファイルを読み取り、各フィールドの最大値、最小値、平均値を計算するスクリプトを作成する必要があります。

sample.dat

フィールド 1: 実験 1: 10.0
フィールド 2: 実験 1: 12.5
フィールド 1: 実験 2: 5.0
フィールド 2: 実験 2: 14.0
フィールド 1: 実験 3: 18.0
フィールド 2: 実験 3: 3.5

出力

フィールド 1: 最大 = 18.0、最小 = 5.0、平均 = 11.0
field2: MAX = 14.0、MIN = 3.5、AVERAGE = 10.0
4

5 に答える 5

3
awk -F: '
{
    sum[$1]+=$3;
    if(!($1 in min) || (min[$1]>$3))
        min[$1]=$3;
    if(!($1 in max) || (max[$1]<$3))
        max[$1]=$3;
    count[$1]++
}
END {
  for(element in sum)
      printf("%s: MAX=%.1f, MIN=%.1f, AVARAGE=%.1f\n",
              element,max[element],min[element],sum[element]/count[element])
}' sample.dat

出力

field1: MAX=18.0, MIN=5.0, AVARAGE=11.0
field2: MAX=14.0, MIN=3.5, AVARAGE=10.0
于 2013-05-15T18:46:28.103 に答える
2

これが私が作成したPerlソリューションです(使用するファイルのファイル名を置き換えてください):

#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw(max min sum);

open( my $fh, "<", "sample.dat" ) or die $!;

my %fields;
while (<$fh>) {
    chomp;
    $_ =~ s/\s+//g;
    my @line = split ":";
    push @{ $fields{ $line[0] } }, $line[2];
}

close($fh);

foreach ( keys %fields ) {
    print "$_: MAX="
      . max @{ $fields{$_} };
    print ", MIN="
      . min @{ $fields{$_} };
    print ", AVERAGE="
      . ( (sum @{ $fields{$_} }) / @{ $fields{$_} } ) . "\n";
}
于 2013-05-15T19:09:19.967 に答える
2

bashbc:_

#!/bin/bash

declare -A min
declare -A max
declare -A avg
declare -A avgCnt

while read line; do
  key="${line%%:*}"
  value="${line##*: }"
  if [ -z "${max[$key]}" ]; then
    max[$key]="$value"
    min[$key]="$value"
    avg[$key]="$value"
    avgCnt[$key]=1
  else
    larger=`echo "$value > ${max[$key]}" | bc`
    smaller=`echo "$value < ${min[$key]}" | bc`
    avg[$key]=`echo "$value + ${avg[$key]}" | bc`
    ((avgCnt[$key]++))
    if [ "$larger" -eq "1" ]; then
      max[$key]="$value"
    fi
    if [ "$smaller" -eq "1" ]; then
      min[$key]="$value"
    fi
  fi
done < "$1"

for i in "${!max[@]}"
do
  average=`echo "${avg[$i]} / ${avgCnt[$i]}" | bc`
  echo "$i: MAX = ${max[$i]}, MIN = ${min[$i]}, AVERAGE = $average"
done
于 2013-05-16T09:47:03.397 に答える
1

このpythonコードを利用できます:

from collections import defaultdict
d = defaultdict(list)
[d[(line.split(":")[0])].append(float(line.split(":")[2].strip("\n "))) for line in open("sample.dat")]
for f in d:  print f, ": MAX=", max(d[f]),", MIN=", min(d[f]),", AVG=", sum(d[f])/float(len(d[f]))
于 2013-05-16T06:00:12.173 に答える