83 lines
1.8 KiB
Awk
83 lines
1.8 KiB
Awk
# wc.awk --- count lines, words, characters, bytes
|
|
#
|
|
# Arnold Robbins, arnold@skeeve.com, Public Domain
|
|
# May 1993
|
|
# Revised September 2020
|
|
|
|
# Options:
|
|
# -l only count lines
|
|
# -w only count words
|
|
# -c only count bytes
|
|
# -m only count characters
|
|
#
|
|
# Default is to count lines, words, bytes
|
|
#
|
|
# Requires getopt() and file transition library functions
|
|
# Requires mbs extension from gawkextlib
|
|
|
|
@load "mbs"
|
|
|
|
BEGIN {
|
|
# let getopt() print a message about
|
|
# invalid options. we ignore them
|
|
while ((c = getopt(ARGC, ARGV, "lwcm")) != -1) {
|
|
if (c == "l")
|
|
do_lines = 1
|
|
else if (c == "w")
|
|
do_words = 1
|
|
else if (c == "c")
|
|
do_bytes = 1
|
|
else if (c == "m")
|
|
do_chars = 1
|
|
}
|
|
for (i = 1; i < Optind; i++)
|
|
ARGV[i] = ""
|
|
|
|
# if no options, do lines, words, bytes
|
|
if (! do_lines && ! do_words && ! do_chars && ! do_bytes)
|
|
do_lines = do_words = do_bytes = 1
|
|
|
|
print_total = (ARGC - i > 1)
|
|
}
|
|
function beginfile(file)
|
|
{
|
|
lines = words = chars = bytes = 0
|
|
fname = FILENAME
|
|
}
|
|
function endfile(file)
|
|
{
|
|
tlines += lines
|
|
twords += words
|
|
tchars += chars
|
|
tbytes += bytes
|
|
if (do_lines)
|
|
printf "\t%d", lines
|
|
if (do_words)
|
|
printf "\t%d", words
|
|
if (do_chars)
|
|
printf "\t%d", chars
|
|
if (do_bytes)
|
|
printf "\t%d", bytes
|
|
printf "\t%s\n", fname
|
|
}
|
|
# do per line
|
|
{
|
|
chars += length($0) + 1 # get newline
|
|
bytes += mbs_length($0) + 1
|
|
lines++
|
|
words += NF
|
|
}
|
|
END {
|
|
if (print_total) {
|
|
if (do_lines)
|
|
printf "\t%d", tlines
|
|
if (do_words)
|
|
printf "\t%d", twords
|
|
if (do_chars)
|
|
printf "\t%d", tchars
|
|
if (do_bytes)
|
|
printf "\t%d", tbytes
|
|
print "\ttotal"
|
|
}
|
|
}
|