Find smallest & largest in every column

Dear All,

I have input like this,

J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1501      1     1   4      6101      7392  2      2442      2685 18      3201      4008 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1502      1     1   4      5125      6416  2      2198      2442 18      2713      3520 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1503      1     1   4      4153      5440  2      1955      2198 18      2227      3032 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1504      1     1   4      3177      4468  2      1711      1955 18      1739      2546 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1505      1     1   4      2205      3492  2      1468      1711 18      1253      2058 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1506      1     1   4      1229      2520  2      1224      1468 18       765      1572 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1507      1     1   4       253      1544  2       980      1224 18       277      1084 20       120      4158
J_15TEST_ASH05_33A22.13885.txt: $$    1   MAKE   SP1508      1     1   4         9       568  2       920       980 18       155       596 20       120      4158

Expected result:

J_15TEST_ASH05_33A22.13885.txt:   NumFile=4    | D4  min=9 max=7392   | D2 min=920 max=2685   | D18 min=155    max=4008   | D20 min=120    max=4158    

Description: need to find smallest & largest in column

My recent code( not working well):

awk 'BEGIN {maa = 0} {mab=0} {mad=$10} {mae=0} {maf=0} {mag=0} {mah=0} {mai=0} {maj=0} {mak=0} {mal=0} {mam=0} {mac=$9}  {a=$1} {b=$8} {c=$9} {d=$10} {e=$11} {f=$12} {g=$13} {h=$14} {i=$15} {j=$16} {k=$17} {l=$18} {m=$19} {if (a>maa) maa=a} {if (b>mab) mab=b} {if (d>mad) mad=d} {if (e>mae) mae=e} {if (f>maf) maf=f} {if (g>mag) mag=g} {if (h>mah) mah=h} {if (i>mai) mai=i} {if (j>maj) maj=j} {if (k>mak) mak=k} {if (l>mal) mal=l} {if (m>mam) mam=m} {if (c<mac) mac=c}END {print maa,"NumFile="NR, "| D"mab,"min="mac,"max="mad,"| D"mae,"min="maf,"max="mag,"| D"mah,"min="mai,"max="maj,"| D"mak,"min="mal,"max="mam}' input > output

Put this into "script.awk":

BEGIN {
  a[9]=a[10]=a[12]=a[13]=a[15]=a[16]=a[18]=a[19]=1
}
NR==1 {
  f=$1;n=$8;
  for (i in a) {
    m=$i
    M=$i
  }
}
{
  for (i in a) {
    m=($i<m)?$i:m
    M=($i>M)?$i:M
  }
}
END {
  printf ("%s   NumFile=%d    | D4  min=%d max=%d   | D2 min=%d max=%d   | D18 min=%d    \
max=%d   | D20 min=%d    max=%d\n", f, n, m[9], M[10], m[12], M[13], m[15], M[16], m[18], M[19])
}

Then run:

awk -f script.awk input
1 Like

Try sth along this line (and expand):

awk     'function min (M, V1, V2) {if ((!M) || V1<M) M=V1; if (V2<M) M=V2; return M}
         function max (M, V1, V2) {if ((!M) || V1>M) M=V1; if (V2>M) M=V2; return M}
                        {NI[$1]++
                         Min[$8]=min (Min[$8], $9, $10)
                         Max[$8]=max (Max[$8], $9, $10)}
         END {print "Numfile: ", NI[$1], "| D"$8"   min=", Min[$8]," max=", Max[$8]}
        ' file
Numfile:  8 | D4   min= 9  max= 7392
1 Like

I suspect this is not always correct.
I would prefer a simple

function min(a,b) {if (a<b) return a; return b}

and

Min[$8]=($8 in Min) ? min(Min[$8], min($9, $10)) : min($9, $10)

Dito with max.

1 Like

hi bartus11,

it work..thank you.