linuxbashscriptingawktail

Implement tail with awk


I am struggling with this awk code which should emulate the tail command

num=$1;
{
    vect[NR]=$0;
    
}
END{
    for(i=NR-num;i<=NR;i++)
            print vect[$i]
}

So what I'm trying to achieve here is an tail command emulated by awk/ For example consider cat somefile | awk -f tail.awk 10 should print the last 10 lines of a text file, any suggestions?


Solution

  • for(i=NR-num;i<=NR;i++)
        print vect[$i]
    

    $ indicates a positional parameter. Use just plain i:

    for(i=NR-num;i<=NR;i++)
        print vect[i]
    

    The full code that worked for me is:

    #!/usr/bin/awk -f
    BEGIN{
            num=ARGV[1];
            # Make that arg empty so awk doesn't interpret it as a file name.
            ARGV[1] = "";
    }
    {
            vect[NR]=$0;
    }
    END{
            for(i=NR-num;i<=NR;i++)
                    print vect[i]
    }
    

    You should probably add some code to the END to handle the case when NR < num.