Bash and AWK are great tools for writing small programs. In this blog, we use AWK in a Bash script to print long lines in a file.
longlines.sh
#!/bin/bash usage() { cat <<EOF usage: $(basename $0) [-m MAX] [-n] FILEs... Prints the lines in FILEs that have a length greater than MAX. By default, MAX is 80. If -n is given, the line number is also printed. EOF } max=80 printlines=0 while getopts m:n flag do case $flag in m) max=$OPTARG ;; n) printlines=1 ;; \?) usage exit 1 ;; :) echo "option -$OPTARG requires an argument" usage exit 1 ;; esac done shift $(( OPTIND - 1)); if [[ $# -lt 1 ]] then usage exit 1 fi awk -v max=$max -v printlines=$printlines \ 'length($0) > max { if (printlines) printf("%6d: ", FNR) print $0 }' $*
Notice how the -v option to awk allows us to set variables in the AWK script from values in the Bash portion of the script.
The following example prints words in the American English dictionary that have more than 21 characters.
longlines.sh example
$ ./longlines.sh -m 21 /usr/share/dict/american-english Andrianampoinimerina's counterrevolutionaries counterrevolutionary's electroencephalogram's electroencephalograph's electroencephalographs
An alternative way to write the awk portion of the script is
awk \ 'length($0) > max { if (printlines) printf("%6d: ", FNR) print $0 }' max=$max printlines=$printlines $*
The use of -v makes the variables available to the entire script, including the special rule BEGIN; specifing the values as max=$max makes the variables available to all rules, excluding the special rule BEGIN.
No comments:
Post a Comment