1753496 Members
4700 Online
108794 Solutions
New Discussion юеВ

Re: AWK Script Problem

 
SOLVED
Go to solution
Darren Etheridge_2
Super Advisor

Re: AWK Script Problem

Well this part of my script works perfectly. Now in my input file I have about 100 different account to compare and change values to match our system. What is the best way to compare each value instead of an if then else structure.. since I can't use CASE, in addition I want the values that don't meet any of the comparisions (TRUE) to be kicked to a dump file. BTW, Gopi your answer was KEY to fix my problem... THANKS TO ALL!!!!


cat ws.datx >> wsdata.dat
echo "Parsing wsdata.dat" >> $LOGFL

cat /pei/peifas/ws/wsdata.dat |
awk 'BEGIN { FS=" "; x = 0; }
{
if ( x == 0 ){
b_month = substr($0,1,2)
b_day = substr($0,3,2)
b_fullyear = substr($0,5,4)
b_year = substr($0,7,2)
x = 1
} else {

value1 = substr($0, 1, 14)
gl_acct = 1234
#acct = substr($0, 4, 8)
damt = substr($0, 93, 13)
camt = substr($0, 105, 13)
desc = "W&S BATCH-" b_month""b_day""b_year
transamt = damt-camt
{
if (value1 == "41122010110296")
{ fund="411"
acct="2071130"


printf("||%s|%s||||%s||%s|%s|N|%s/%s/%s|WSIMPORT|WS%s%s%s|||\n", fund, acct, gl_acct, desc, transamt, b_month, b_day, b_fullyear, b_month, b_day, b_year)
}}
}
}' > ws.out
H.Merijn Brand (procura
Honored Contributor

Re: AWK Script Problem

[ /me shamelessly keeps plugging perl as *the* solution to these growing problems ]

To continue on what I had

somewhere in the beginning you now will have

my %hash = (
# value => [ fund, acct ]
4111151000000 => [ 411, 2071130 ],
4213253710000 => [ 421, 2098812 ],
:
:
);

then where I had the test,

exists $hash{$value1} or next;
my ($fund, $acct) = @{$hash{$value1}};

printf "||%s|%s||||%s||%s|%s|N|%s/%s/%s|WSIMPORT|WS%s%s%s|||\n",
$fund, $acct, $gl_acct, $desc, $transamt,
$b_month, $b_day, $b_fullyear, $b_month, $b_day, $b_year;


and you don't need no switch/case at all!

Enjoy, Have FUN! H.Merijn
Enjoy, Have FUN! H.Merijn
Rodney Hills
Honored Contributor

Re: AWK Script Problem

My first post showed how to do it with "awk" using "associative arrays". It is similar to what Procura demonstrated. If you text processing gets much more complicated, then "perl" would be the more prefered tool.

My 2 cents

-- Rod Hills
There be dragons...
Rodney Hills
Honored Contributor

Re: AWK Script Problem

Procura,

I'm thought you might have changed-
printf "||%s|%s||||%s||%s|%s|N|%s/%s/%s|WSIMPORT|WS%s%s%s|||\n",
$fund, $acct, $gl_acct, $desc, $transamt,
$b_month, $b_day, $b_fullyear, $b_month, $b_day, $b_year;

to use join-
print join("|","","",$fund, $acct, "","","",$gl_acct,"", $desc, $transamt,"N",join("/",$b_month, $b_day, $b_fullyear), "WS".$b_month.$b_day.$b_year,"","",""),"\n";

Which I think is more readable then a printf...

My 4 cents...

-- Rod Hills
There be dragons...
Darren Etheridge_2
Super Advisor

Re: AWK Script Problem

Rodney,
I tried using the array syntax you advised but can't seem to get it to only process the TRUE values of the array... How would I do this?




transamt = damt-camt

#if (value1 == "41122010110296")
# { fund="411"
# acct="2071130"
{
a["41122010110296"]="411,2071130"

split(a[value1],b,",")

fund=b[1]
acct=b[2]


printf("||%s|%s||||%s||%s|%s|N|%s/%s/%s|WSIMPORT|WS%s%s%s|||\n", fund, acct, gl_
acct, desc, transamt, b_month, b_day, b_fullyear, b_month, b_day, b_year)

}
}'
Rodney Hills
Honored Contributor

Re: AWK Script Problem

You will need one if statement.

BEGIN{
a["411115100000"]="411,2071130"
a["411222200000"]="511,3082240"
}
{
value1=substr($0,1,14)
...
if (a[value1]) {
split(a[value1],b,",")
fund=b[1]
acct=b[2]
print value1,fund,acct
}
}

If a[value1] does not have a value, which means you have not set a predefined mapping in the BEGIN block, then the if block will not print the record.

HTH

-- Rod Hills

There be dragons...
H.Merijn Brand (procura
Honored Contributor

Re: AWK Script Problem

Rodney, yes, I usualy do not use printf for this, but in this phase of plugging perl to take over awk, I think I should not push the limits. Pushing the limits, would be using $,, $", and "@{[join]}" just for obfuscational reasons

I also think that with so many fields, csv is to be prefered over '|' separators

Enjoy, Have FUN! H.Merijn
Enjoy, Have FUN! H.Merijn