Home > other >  AWK script with multiple statements not working on txt file
AWK script with multiple statements not working on txt file

Time:12-31

I have a large file called an.txt:

head -n 6 an.txt 

Type    Details Particulars Code    Reference   Amount  Date    ForeignCurrencyAmount   ConversionCharge
Bank Fee    Monthly A/C Fee             -8.50   31/03/2021      
Eft-Pos Rutherford & Bond   4835********    8848   C    210331123119    -250.00 31/03/2021      
Payment Avery Johnson   Avery Johnso    592315  Labour  -131.60 31/03/2021      
Bill Payment    Collins Tf  127 Driver  Crescent    I1600   50.00   31/03/2021      
Bill Payment    Becta Ltd   Taylormallon    Lawns   Inv 1447    46.00   31/03/2021
.
.
.

I have written the following script called b1.awk:

#! /usr/bin/awk -f

BEGIN{
    FS = "\t"
    }
$2 ~ /Lance Te/ {
    s =$6
    }
END{
    print "Lance Te Patu: " s
    } 

BEGIN{
        FS = "\t"
        }
$2 ~ /Matti/ {
        s =$6
        }
END{
        print "Mattingly Court: " s
        }

When called ./b1.awk an.txt I get:

Lance Te Patu: 3170.17
Mattingly Court: 3170.17

The first thing here is that the results are incorrect. The first one is correct but the second should be different. I am not sure why this does not work. The second question is whether /Lance Te/ and /Matti/ can be passed as variables rather than writing seperate awk statements which is what I ideally would like to achieve. I am sorry but I am trying to wrap my head around awk in case this seems a bit dumb to some of you.

CodePudding user response:

You are requiring a fair bit of mind reading, but my crystal ball suggests you might be looking for something like

awk -F '\t' -v regex="Matti|Lance Te" '$2 ~ regex { sum[$2]  = $6 }
    END { for (rcpt in sum) print rcpt ": " sum[rcpt] }' an.txt

where I have assumed that you want to extract the full text from $2 as the actual recipient, although the regex looks for just a substring in each case.

In some more detail, we collect the interesting totals into an associative array sum where the key for each value is the string from $2 and the value is the accrued total of values for $6 from the rows where the key was found.

The immediate problem with your attempt was that you used the same variable s for each sum; you could trivially fix it by using t instead of s in the second set of statements. But repeating the code for each search string is obviously inelegant, cumbersome, and error-prone.

CodePudding user response:

#!/usr/bin/awk -f

BEGIN{
    FS = "\t"
}

$2 ~ /Lance Te|Matti/ {
    s[$2]  = $6
}

END {
    for (i in s)
        print i ": " s[i]
}
  • Related