Code:
> rm out.txt
> cat Malik.awk
#
# DCDB - This block select all DCBEntry records
# and memorize Folder and TZ.
# => Folder[dcdb] and Tz[dcdb]
#
/^[[:space:]]*<DCDBEntry / { # Select DCDBEntry records
split($0, dcdb, /"/); # Split record into dcdb array (sep=")
# dcdb[2]=dcdb, dcdb[4]=folder,
# dcdb[6]=tz
sub(/ *$/, "", dcdb[2]); # Remove trailing spaces from dcdb
Folder[dcdb[2]] = dcdb[4]; # Memorize folder for dcdb
next; # Proceed next input record
} #
#
# LDS - This block select all LDSEntry records
# and memorize SiteUnit and Devide for folder,tz
# => SiteUnit[folder,tz] and Devicefolder,tz
#
/^[[:space:]]*<LDSEntry / { # Select LDSEntry records
split($0, lds, /[":]/); # Split record into lds array (sep=" or sep=:)
# lds[2]=folder, lds[3]=siteunit
# lds[4]=device, lds[6]=tz
folder = lds[2]; # Get folder
ldsv = lds[6]; # Get LDSValue
SiteUnit[folder, ldsv] = lds[3]; # Memorize siteunit for folder,LDSValue
Device[folder, ldsv] = lds[4]; # Memorize device for folder,LDSValue
next; # Proceed next input record
} #
#
# Input - These blocks proceed inputfiles
#
/^[[:space:]]*</ || NF==0 { # Select (and ignore) records from DCDB and LDS and empty records
# (DCDBEntry ans LDSEntry have already been processed)
next; # Procced next input record
} #
FNR==1 { # Select first record of inputfile (logically all other files
# have been processed in previus blocks).
print $0, "Folder", "SU", "Dev"; # Print first record (headers) and add new headers
next; # Proceed next input record
} #
$2 == "TOTAL" { # Select TOTAL record
print; # Print TOTAL record
next; # Proceed next input record
}
{ # Select all reamaining inputfile records
dcdb_in = $2; # Get dcdb from input record
if (length(dcdb_in) > 7) { # Check if dcdb and LDSValue merged
ldsv = substr(dcdb_in,8); # extract dcdb
dcdb_in = substr(dcdb_in,1,7);# extract LDSValue
} else # not merged
ldsv = $3; # Get LDSValue from input record
folder = Folder[dcdb_in]; # Get memorized folder for this dcdb
su = SiteUnit[folder, ldsv]; # Get memorized siteunit for this forder,ldsv
dev = Device[folder, ldsv]; # Get memorized device for this forder,ldsv
print $0, (folder ? folder : "?"), (su ? su : "?"), (dev ? dev : "?"); # Print record,
# folder, siteunit and device (unknown values are
# replaced by ?
next; # Proceed next input record
}
> cat Malik.sh
awk -f Malik.awk \
DCDB.xml \
LDS-*.xml \
LIVE9091.S20080817.txt \
> out.txt
> Malik.sh
> diff -b out.txt LIVE9091.S20080817_new.txt
>