A_Rob
A_Rob

Reputation: 3

Possible to modify action in each iteration of awk? Please

Each line of my input file has format

[IDNum FirstName LastName test1Score test2Score test3Score......]

I need to print the test averages in the following format:

Test1: test1Avg  
Test2: test2Avg  
Test3: test3Avg  
.  
.  
.

I'm struggling immensely to get the test averages to be unique (not all the first test's avg)

I'm running this awk statement, but it prints out (it's obvious why) test1's average for all tests.

awk '{sum+=$4} END {for(i=4; i<=NF; i++) printf (Test%d %d\n", i-3, sum/NR)}' 

I need to somehow increment the $4 to $5 and so on on each iteration to get what I want, although I'm not sure it's possible.

Upvotes: 0

Views: 63

Answers (3)

anubhava
anubhava

Reputation: 785761

You can use:

awk 'NF>3 {for(i=4; i<=NF; i++) a[i]+=$i}
      END { for(i=4; i<=NF; i++) printf "Test%d %.2f\n", (i-3), (a[i]/NR)}' 

Upvotes: 2

Vijay
Vijay

Reputation: 67301

Using perl:

perl -lane 'if($.==1)
{
@a=@F[2..(scalar(@F)-1)] 
}
else
{
@a = map { $a[$_] + $F[$_+2] } 0..$#a;
}
END{for($i=0;$i<scalar(@a);$i++ ){print "Test".($i+1).":".$a[$i]/$.}}' your_file

Tested Here

Upvotes: 2

qwwqwwq
qwwqwwq

Reputation: 7329

It's very possible!

Assuming the numerical columns start at column 4 and continue until the last column, also assuming the presence of a header row here (not clear if that's the case):

awk '
NR==1{ 
  for( i=4;i<=NF;i++) { 
    header[i] = $i 
  }; 
}
NR>1{ 
  for( i=4;i<=NF;i++) { 
    arr[i] += $i 
  }; 
}
END{ 
  print "column","avg";
  for( i=4;i<=NF;i++) { 
    print header[i],arr[i]/(NR-1) 
  };
}' data.txt

Sample input:

IDNum FirstName LastName test1Score test2Score test3Score
1     bob       jones    1          2          3
2     jill      jones    2          4          6

Sample output:

column avg
test1Score 1.5
test2Score 3
test3Score 4.5

Upvotes: 2

Related Questions