Search code examples
awkmin

AWK - find min value of each row with arbitrary size


I have a file with the lines as:

5 3 6 4 2 3 5
1 4 3 2 6 5 8
..

I want to get the min on each line, so for example with the input given above, I should get:

min of first line:  2
min of second line: 1
..

How can I use awk to do this for any arbitrary number of columns in each line?


Solution

  • If you don't mind the output using digits instead of words you can use this one liner:

    $ awk '{m=$1;for(i=1;i<=NF;i++)if($i<m)m=$i;print "min of line",NR": ",m}' file
    min of line 1:  2
    min of line 2:  1
    

    If you really do want to count in ordinal numbers:

    BEGIN {
        split("first second third fourth",count," ")
    }
    {
        min=$1
        for(i=1;i<=NF;i++)
        if($i<min)
            min=$i
    
        print "min of",count[NR],"line: \t",min
    }
    

    Save this to script.awk and run like:

    $ awk -f script.awk file
    min of first line:    2
    min of second line:   1
    

    Obviously this will only work for files with upto 4 lines but just increase the ordinal numbers list to the maximum number you think you will need. You should be able to find a list online pretty easily.