Redirecting output in AWK
David Elliott
dce at mips.COM
Wed Oct 5 00:28:33 AEST 1988
In article <816 at mergvax> rkxyv at mergvax (Rob Kedoin) writes:
>
>I am trying to use AWK to split one file into many formatted, smaller files.
>
>The problem I am having is that I cannot output to more than 10 files. I am
>doing my output in a manner similar to:
> MY_FILE="foo";
> printf("abc\n") >> MY_FILE;
> close(MY_FILE);
>Even though I am executing the close, I am still running out of files. Does
>anyone know of a fix to this ?
I tested awk (SVR3.1) using '>' on our system and it works just fine.
Are you sure that '>>' is affected by close?
Anyway, in case you can't get a fix in time, here are some tricks you
can use to get the job done:
1. Use awk to generate a set of lines of the form:
filename text
and pipe it to a shell "while read" loop. The code would look
like:
awk '{ ... }' | sed 's/\\/\\\\/g' | while read file line
do
echo "$line" >> "$file"
done
(The sed script is required if your 'read' processes backslashes; mine
does.)
2. Make multiple passes on the input, processing only 9 files per pass,
putting error messages in the 10th. The code would look like:
INPUT=/usr/tmp/script.input.$$
TEMPF=/usr/tmp/script.tempf.$$
ERRORS=/usr/tmp/script.errs.$$
cp input $INPUT
while [ -s $INPUT ] # while input is not empty
do
awk 'BEGIN {
nfiles = 0;
errfile = "'$ERRORS'";
}
(nfiles > 9) {
print;
next;
}
{
process input, putting errors into errfile and
incrementing nfiles when you open a new file
}' $INPUT > $TEMPF
if [ -s $ERRORS ]
then
cat $ERRORS 1>&2
break
fi
cp $TEMPF $INPUT
done
rm -f $INPUT $TEMPF $ERRORS
3. Combine these two, doing 9 files of output in the awk, and printing
the "filename text" lines to stdout for the while loop to process.
If you have fewer than 10 files, you get all the work done in awk,
and if you have more, you still come out OK, but slower.
This should be easy to do if you define a function to do your
outputting, letting it keep track of the number of output files
and deciding whether to put the output into a file or to format
it to stdout.
--
David Elliott dce at mips.com or {ames,prls,pyramid,decwrl}!mips!dce
More information about the Comp.unix.wizards
mailing list