Aqui está uma implementação no awk. Já faz algum tempo desde que eu usei a linguagem por mais de um par de programa de linha, e pensei que seria um exercício interessante.
Para executar o awk com um programa, você precisa especificar o -f
flag, por exemplo:
awk -f my_program.awk my_data.txt
Esta implementação apenas exibe as variáveis CONDx que ele encontra no arquivo.
# Initialize a couple of variables
BEGIN {
fill_value = "xx"
record_number = 0
}
# for any line that begins and ends with 'foo' save the record
# and then move on to process the next line
/^foo$/ { save_record(); next }
# for any other line, grab the key and data, and mark that the record is valid
{
fields[$1] = $1
record[$1] = $2;
record[1] = "exists"
}
# after reading in all of the records, output them
END {
# sort the fields into alpha order
asort(fields)
delete fields["REF"]
printf("%-8s", "REF")
for (field in fields) {
printf("%-8s", fields[field])
}
print ""
# print the records
for (i=0; i < record_number; i++) {
record_name = record_number_str(i, "REF");
printf("%-8s", records[record_name])
for (field in fields) {
record_name = record_number_str(i, fields[field])
to_print = fill_value
if (record_name in records)
to_print = records[record_name]
printf("%-8s", to_print)
}
print ""
}
}
function save_record() {
if (1 in record) {
delete record[1]
for (rec in record)
records[record_number_str(record_number, rec)] = record[rec]
record_number++
}
delete record
}
# awk only has single dimensional associative arrays. So we need
# to construct a key for the array that has two dimensions
function record_number_str(record_number, rec) {
return sprintf("%06d %s", record_number, rec)
}
Eu acho que o awk não é a linguagem ideal para isso. Melhor seria algo como: perl, ruby ou python. Como contraste, aqui está a implementação de python. Note que é apenas cerca de 1/2 quantas linhas:
import fileinput
record = {}
records = []
fields = set()
for line in [l.strip() for l in fileinput.input()]:
if line == 'foo':
if record:
records.append(record)
record = {}
else:
key, value = line.split()
record[key] = value
fields.add(key)
# print the header
print("%-8s" % "REF", end="")
fields.remove("REF")
for field in sorted(fields):
print("%-8s" % field, end="")
print()
# print the records
for record in records:
print("%-8s" % record["REF"], end="")
for field in sorted(fields):
print("%-8s" % record.get(field, ''), end="")
print()