For scratch-pad I need to reverse the order of the records in my log file. The tricky thing is that each record is one or more lines separated by a form feed or page break: “\f” or ^L.
Here’s my 1st version using getline. getline allows us to consume lines without exiting the current rule:
BEGIN { i = 0 }
{
do {
sort[i] = sort[i] $0 "\n";
getline; # Where the magic happens
} while ($0 != "\f");
sort[i] = sort[i] $0;
i += 1;
}
END {
for (x = i - 1; x > -1; x--) {
print sort[x];
}
}
It worked well enough, but there’s something much simpler. In Awk the record separator can be any string, it doesn’t have to be a carriage return. We can change to record separator at runtime using the RS variable. This simplifies things:
BEGIN { RS="\f\n"; i = 0 }
{
sort[++i] = $0
}
END {
for (x = i; x > 0; x--) {
print sort[x] "\f";
}
}