Eric
Eric

Reputation: 41

How to use awk to search for min and max values of column in certain files

I know that awk is helpful in trying to find certain things in columns in files, but I'm not sure how to use it to find the min and max values of a column in a group of files. Any advice? To be specific I have four files in a directory that I want to go through awk with.

Upvotes: 1

Views: 6098

Answers (3)

karakfa
karakfa

Reputation: 67467

sort can do the sorting and you can pick up the first and last by any means, for example, with awk

sort -nk2 file{1..4} | awk 'NR==1{print "min:"$2} END{print "max:"$2}'

sorts numerically by the second field of files file1,file2,file3,file4 and print the min and max values.

Since you didn't provide any input files, here is a worked example, for the files

==> file_0 <==
23 29 84
15 58 19
81 17 48
15 36 49
91 26 89

==> file_1 <==
22 63 57
33 10 50
56 85 4
10 63 1
72 10 48

==> file_2 <==
25 67 89
75 72 90
92 37 89
77 32 19
99 16 70

==> file_3 <==
50 93 71
10 20 55
70 7 51
19 27 63
44 3 46

if you run the script, now with a variable column number n

n=1; sort -k${n}n file_{0..3} | 
awk -v n=$n 'NR==1{print "min ("n"):",$n} END{print "max ("n"):",$n}'

you'll get

min (1): 10
max (1): 99

and for the other values of n

n=2; sort ...

min (2): 3
max (2): 93

n=3; sort ...

min (3): 1
max (3): 90

Upvotes: 1

Jonathan Leffler
Jonathan Leffler

Reputation: 753625

If you're looking for the absolute maximum and minimum of column N over all the files, then you might use:

N=6
awk -v N=$N 'NR == 1 { min = max = $N }
                     { if ($N > max) max = $N; else if ($N < min) min = $N }
             END     { print min, max }' "$@"

You can change the column number using a command line option or by editing the script (crude, but effective — go with option handling), or any other method that takes your fancy.

If you want the maximum and minimum of column N for each file, then you have to detect new files, and you probably want to identify the files, too:

 awk -v N=$N 'FNR == 1 { if (NR != 1) print file, min, max; min = max = $N; file = FILENAME }
                       { if ($N > max) max = $N; else if ($N < min) min = $N }
              END      { print file, min, max }' "$@"

Upvotes: 2

danglingpointer
danglingpointer

Reputation: 4920

Try this: it will give min and max in file with comma seperated.

simple:

awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt

or

awk 'BEGIN {min=1000000; max=0;}; { if($2<min && $2 != "") min = $2; if($2>max && $2 != "") max = $2; } END {print min, max}' file

or more awkish way:

awk 'NR==1 { max=$1 ; min=$1 }
     FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
     { $2=($1-min)/(max-min) ; print }' file file

Upvotes: 1

Related Questions