nawk -f fieldwidth.awk filename.txt > FinalResul.txt
fieldwidth.awk:
Code:
function setFieldsByWidth( i,n,FWS,start,copyd0) {
# Licensed under GPL Peter S Tillier, 2003
# NB corrupts $0
copyd0 = $0 # make copy of $0 to work on
if (length(FIELDWIDTHS) == 0) {
print "You need to set the width of the fields that you require" > "/dev/stderr"
print "in the variable FIELDWIDTHS (NB: Upper case!)" > "/dev/stderr"
exit(1)
}
if (!match(FIELDWIDTHS,/^[0-9 ]+$/)) {
print "The variable FIELDWIDTHS must contain digits, separated" > "/dev/stderr"
print "by spaces." > "/dev/stderr"
exit(1)
}
n = split(FIELDWIDTHS,FWS)
if (n == 1) {
print "Warning: FIELDWIDTHS contains only one field width." > "/dev/stderr"
print "Attempting to continue." > "/dev/stderr"
}
start = 1
for (i=1; i <= n; i++) {
$i = substr(copyd0,start,FWS[i])
start = start + FWS[i]
}
}
#Note that the "/dev/stderr" entries in some lines have wrapped.
#I then call setFieldsByWidth() in my main awk code as follows:
BEGIN {
#FIELDWIDTHS="7 6 5 4 3 2 1" # for example
# adjust the FIELDWIDTHS values as you see fit.
FIELDWIDTHS="9 21 51 11 51 11 51 11 51 11 9 9" # for example
OFS="|"
}
!/^[ ]*$/ {
saveDollarZero = $0 # if you want it later
setFieldsByWidth()
# now we can manipulate $0, NF and $1 .. $NF as we wish
# print $0 OFS
print $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12
next
}