Want to improve the performance of script

Hi All,
I have written a script as follows which is taking lot of time in executing/searching only 3500 records taken as input from one file in log file of 12 GB Approximately.
Working of script is read the csv file as an input having 2 arguments which are transaction_id,mobile_number and search the log file having these two strings with one more static string that is "CustomCDRInterceptor",then format the searched data in prescribed format.
Code of script written is as follows:

#!/bin/bash
if [ $# -ne 2 ]
then
    echo "Error in $0 - Invalid Argument Count"
    echo "Syntax: $0 input_file output_file"
    exit
fi
awk -F"," '{print $1 , $2}' $1 |
while read a b
do
  output=`cat $2 | grep "CustomCDRInterceptor" | grep "$a" | grep "$b" | cut -d"|" -f6 | awk -F"," '{print $4,",",$28,",",$27,",",$17,",",$12,","$21,",",$11,",",$26,",",$14,",",$6,",",$30,",",$31,",",$19,",",$5,",",$22,",",$10,",",$9,",",$20,",",$15,",",$29,",",substr($32,1,match($32,/\]/)-1),",",$23,",",$18,",",$24,",",$7,",",$13,",",$2,",",$25,",",$16,",",$8,",",$1,",",$3,","}'`
  #echo $output
  echo $output | perl -F, -lane 's/^\s*[- \w\[]+:(.*?)\s*$/$1/ foreach @F; print join ",", @F'
done

Sample data of input file will be like :

8273518145,SDP-DM-152281623
9062995078,SDP-DM-152281631
7870856010,SDP-DM-152281650
8445208702,SDP-DM-152281662
8923084825,SDP-DM-152281668
9061161091,SDP-DM-152281712
8401832603,SDP-DM-152281733
8273522929,SDP-DM-152281837
8341646298,SDP-DM-152281851
9062930630,SDP-DM-152281868

Sample Data in log file is as follows:

15-Feb-2011 20:56:36,538|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|REInterceptor -  Is already Rated [Yes] RatedPrice [0.0]
15-Feb-2011 20:56:36,538|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|ChargingInterceptor - subscriber details processed sucessfully- {arg0.referenceCode=balanceEnquiry:true;subsChannel:Unknown;channelType:Subscription;transactionId:-23e57aa%3A12e29c422b8%3A502a;pricePtAvl:true;eventType:subscription;contentId:4945;serviceId:CR03;Circle_Name:GJ;Circle_ID:5;isRated:Yes;productName:VAS0003ALL;basePrice:0.0;subsType:RECURRING;Sub_Profile:Pre-Paid, arg0.endUserIdentifier=8401131793, arg0.charge.description= Retrieve-Balance , arg0.charge.currency=INR, arg0.charge.code=, arg0.charge.amount=0.0}
15-Feb-2011 20:56:36,539|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|CustomCDRInterceptor - CDR Info[Optional_Field1:,Subscription_Channel:Unknown,Optional_Field2:,Transaction_ID:,Content_ID:4945,IMEI:,Product_Name:VAS0003ALL,PPL_FLAG:,Charge_Code:,Base_Price:0.0,CustomerID:B_55822315,Circle_Name:UK,Sender_MSISDN:,IMSI:405818123375012,Content_Status:,Location:UK,Circle_ID:18,Original_Content_Owner_ID:,CPNAME:default_provider,Content_Price:0.0,Zone:,Content_Name:,Static_ID:UK#37453052,External_Correlation_Id:5a1fa24a%3A12e29cb5fb3%3A1d75,Subscription_Type:RECURRING,MSISDN:8445862834,Transaction_Mode:Subscription,Transaction_DateTime:2011-02-15 20:56:36 GMT+05:30,Content_Type:,Sub_Profile:Pre-Paid,CPID:,Other_Info:]
15-Feb-2011 20:56:36,539|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|CustomCDRInterceptor - CDR Info[Optional_Field1:,Subscription_Channel:Unknown,Optional_Field2:,Transaction_ID:,Content_ID:4945,IMEI:,Product_Name:VAS0003ALL,PPL_FLAG:,Charge_Code:,Base_Price:0.0,CustomerID:B_44445354,Circle_Name:GJ,Sender_MSISDN:,IMSI:405927121139030,Content_Status:,Location:GJ,Circle_ID:5,Original_Content_Owner_ID:,CPNAME:default_provider,Content_Price:0.0,Zone:Default,Content_Name:,Static_ID:GJ#32697724,External_Correlation_Id:-23e57aa%3A12e29c422b8%3A502a,Subscription_Type:RECURRING,MSISDN:8401131793,Transaction_Mode:Subscription,Transaction_DateTime:2011-02-15 20:56:36 GMT+05:30,Content_Type:,Sub_Profile:Pre-Paid,CPID:,Other_Info:]
15-Feb-2011 20:56:36,540|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|GetBalance|PaymentPlugin-Request -  Get User Balance of: 8445862834
15-Feb-2011 20:56:36,540|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|GetBalance|PaymentPlugin-Request -  Get User Balance of: 8401131793
15-Feb-2011 20:56:36,545|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|GetBalance|PaymentPlugin-Response -  Retrieved Balance Bucket: 1;20091003;20110810;21.50;|

Suggest you forget trying to search multi-gigabyte flat files with Shell programs and look at writing a proper database application using something like Oracle.
Is this data in a database already I wonder?

your sample input file and log file are bad, there is no record can be searched out.

Guess 8273518145 or other numbers are always in $3 in log file, but don't know where to find this pattern: SDP-DM-152281623

You can start by this, it should be more faster than your's

awk -F, 'NR==FNR {a[$1];b[$2];next} /CustomCDRInterceptor && $3 in a && $?? in b {print "XXXXXXX"}' input.file FS="[,|]" log.file

$?? need be replaced by the location of pattern: SDP-DM-152281623

Little tip: less pipes!

this:

output=`cat $2 | grep "CustomCDRInterceptor" | grep "$a" | grep "$b" | cut -d"|" -f6 | awk -F"," '{print $4,",",$28,",",$27,",",$17,",",$12,","$21,",",$11,",",$26,",",$14,",",$6,",",$30,",",$31,",",$19,",",$5,",",$22,",",$10,",",$9,",",$20,",",$15,",",$29,",",substr($32,1,match($32,/\]/)-1),",",$23,",",$18,",",$24,",",$7,",",$13,",",$2,",",$25,",",$16,",",$8,",",$1,",",$3,","}'`

could be turned into this:

grep -e "CustomCDRInterceptor" -e "$a" -e "$b" | cut ....

Also, it's more expensive to issue 3500 grep's over 12GB than iterator over 12GBs issuing a grep over 3500 lines. Invert you search order.
Look from logs to records, not from records to logs.

@carrucio

This does not match the requirement because "-e" just means "OR" and it will output all records which contain any one or more of the the three strings.

@poweroflinux
Though I still think that this needs to be a database program and based on your limited and inconsistent data sample, you can reduce the processing by using a workfile containing only the record type "CustomCDRInterceptor".
Also you need to "while read" $output in case there is more than one hit.
The whole script is dubious because of the chance of false hits.
I've left the "perl" alone because I don't know what it does and why the "awk" format is not enough (... unless it was dealing with multiple records in the same environment variable?). We really need to see representative data and required output and to know whether the order of the output is important.

grep "CustomCDRInterceptor" $2 > /tmp/workfile
awk -F"," '{print $1 , $2}' /tmp/workfile | \
while read a b
do
  grep "$a" /tmp/workfile | grep "$b" | cut -d"|" -f6 | awk -F"," '{print $4,",",$28,",",$27,",",$17,",",$12,","$21,",",$11,",",$26,",",$14,",",$6,",",$30,",",$31,",",$19,",",$5,",",$22,",",$10,",",$9,",",$20,",",$15,",",$29,",",substr($32,1,match($32,/\]/)-1),",",$23,",",$18,",",$24,",",$7,",",$13,",",$2,",",$25,",",$16,",",$8,",",$1,",",$3,","}' | while read output
   do
        #echo $output
        echo "$output" | perl -F, -lane 's/^\s*[- \w\[]+:(.*?)\s*$/$1/ foreach @F; print join ",", @F'
done

Depending on how big a workfile containing only "CustomCDRInterceptor" records becomes, there is potential to create a stuctured temporary file containing only relevant record types and relevant fields. Then to sort both this file and the search pattern file to a common order prior to running a single-pass match against 3500 records rather than running 3500 searches.

Do the following:

(1) Post your sample input file.
(2) Post your script.
(3) Post your output file.
(4) If we run your script on your sample input file, then our output should match your posted output file.

Have a closer look at what you've posted -

$
$ # your input file
$
$ cat f0.in
8273518145,SDP-DM-152281623
9062995078,SDP-DM-152281631
7870856010,SDP-DM-152281650
8445208702,SDP-DM-152281662
8923084825,SDP-DM-152281668
9061161091,SDP-DM-152281712
8401832603,SDP-DM-152281733
8273522929,SDP-DM-152281837
8341646298,SDP-DM-152281851
9062930630,SDP-DM-152281868
$
$
$ # your script
$
$ cat f0.sh
#!/bin/bash
if [ $# -ne 2 ]
then
    echo "Error in $0 - Invalid Argument Count"
    echo "Syntax: $0 input_file output_file"
#    exit
fi
awk -F"," '{print $1 , $2}' $1 |
while read a b
do
  output=`cat $2 | grep "CustomCDRInterceptor" | grep "$a" | grep "$b" | cut -d"|" -f6 | awk -F"," '{print $4,",",$28,",",$27,",",$17,",",$12,","$21,",",$11,",",$26,",",$14,",",$6,",",$30,",",$31,",",$19,",",$5,",",$22,",",$10,",",$9,",",$20,",",$15,",",$29,",",substr($32,1,match($32,/\]/)-1),",",$23,",",$18,",",$24,",",$7,",",$13,",",$2,",",$25,",",$16,",",$8,",",$1,",",$3,","}'`
  #echo $output
  echo $output | perl -F, -lane 's/^\s*[- \w\[]+:(.*?)\s*$/$1/ foreach @F; print join ",", @F'
done
$
$
$ # i'll run your script on your input file
$
$ ./f0.sh f0.in f0.out
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
cat: f0.out: No such file or directory
 
$
$ # do we have an output file ?
$
$ cat f0.out
cat: f0.out: No such file or directory
$
$

tyler_durden

You know, it's really frustrating to try to solve a problem, only to find out the data provided won't actually work no matter what the solution is. That said, I was bored and wanted to find a pure shell solution to this, so this is what I came up with. Granted, I don't understand your infile (none of the values you provide with you in file are in the sample log file, and whatever the second value is, the spd-whatever, I'm not even sure where that would show up in the log, so I used a made up test).

For this example, I took the first value in your input and replaced the second column in one line of your log file with it, otherwise, no matter what, there would be no results. Also, instead of looking for the second value, I just confirmed that the third column said "subscription_app" and that the line contained the string "CustomCDRInterceptor" in it:

(15:36:59\[D@DeCoWork15)
[~/Desktop]$ cat input
8273518145,SDP-DM-152281623
9062995078,SDP-DM-152281631
7870856010,SDP-DM-152281650
8445208702,SDP-DM-152281662
8923084825,SDP-DM-152281668
9061161091,SDP-DM-152281712
8401832603,SDP-DM-152281733
8273522929,SDP-DM-152281837
8341646298,SDP-DM-152281851
9062930630,SDP-DM-152281868

(15:37:07\[D@DeCoWork15)
[~/Desktop]$ cat log
15-Feb-2011 20:56:36,538|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|REInterceptor -  Is already Rated [Yes] RatedPrice [0.0]
15-Feb-2011 20:56:36,538|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|ChargingInterceptor - subscriber details processed sucessfully- {arg0.referenceCode=balanceEnquiry:true;subsChannel:Unknown;channelType:Subscription;transactionId:-23e57aa%3A12e29c422b8%3A502a;pricePtAvl:true;eventType:subscription;contentId:4945;serviceId:CR03;Circle_Name:GJ;Circle_ID:5;isRated:Yes;productName:VAS0003ALL;basePrice:0.0;subsType:RECURRING;Sub_Profile:Pre-Paid, arg0.endUserIdentifier=8401131793, arg0.charge.description= Retrieve-Balance , arg0.charge.currency=INR, arg0.charge.code=, arg0.charge.amount=0.0}
15-Feb-2011 20:56:36,539|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|CustomCDRInterceptor - CDR Info[Optional_Field1:,Subscription_Channel:Unknown,Optional_Field2:,Transaction_ID:,Content_ID:4945,IMEI:,Product_Name:VAS0003ALL,PPL_FLAG:,Charge_Code:,Base_Price:0.0,CustomerID:B_55822315,Circle_Name:UK,Sender_MSISDN:,IMSI:405818123375012,Content_Status:,Location:UK,Circle_ID:18,Original_Content_Owner_ID:,CPNAME:default_provider,Content_Price:0.0,Zone:,Content_Name:,Static_ID:UK#37453052,External_Correlation_Id:5a1fa24a%3A12e29cb5fb3%3A1d75,Subscription_Type:RECURRING,MSISDN:8445862834,Transaction_Mode:Subscription,Transaction_DateTime:2011-02-15 20:56:36 GMT+05:30,Content_Type:,Sub_Profile:Pre-Paid,CPID:,Other_Info:]
15-Feb-2011 20:56:36,539|8273518145|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|CustomCDRInterceptor - CDR Info[Optional_Field1:,Subscription_Channel:Unknown,Optional_Field2:,Transaction_ID:,Content_ID:4945,IMEI:,Product_Name:VAS0003ALL,PPL_FLAG:,Charge_Code:,Base_Price:0.0,CustomerID:B_44445354,Circle_Name:GJ,Sender_MSISDN:,IMSI:405927121139030,Content_Status:,Location:GJ,Circle_ID:5,Original_Content_Owner_ID:,CPNAME:default_provider,Content_Price:0.0,Zone:Default,Content_Name:,Static_ID:GJ#32697724,External_Correlation_Id:-23e57aa%3A12e29c422b8%3A502a,Subscription_Type:RECURRING,MSISDN:8401131793,Transaction_Mode:Subscription,Transaction_DateTime:2011-02-15 20:56:36 GMT+05:30,Content_Type:,Sub_Profile:Pre-Paid,CPID:,Other_Info:]
15-Feb-2011 20:56:36,540|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|GetBalance|PaymentPlugin-Request -  Get User Balance of: 8445862834
15-Feb-2011 20:56:36,540|8401131793|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|GetBalance|PaymentPlugin-Request -  Get User Balance of: 8401131793
15-Feb-2011 20:56:36,545|8445862834|subscription_app|5a1fa24a%3A12e29cb5fb3%3A1d75|ChargeAmount|GetBalance|PaymentPlugin-Response -  Retrieved Balance Bucket: 1;20091003;20110810;21.50;|

(15:37:09\[D@DeCoWork15)
[~/Desktop]$ cat attempt.sh
    #!/bin/bash

    IFS=",";
    cat input | while read -a i; do
        IFS="|"
        while read -a x; do
            if [[ "${x[1]}" -eq "${i[0]}" ]] && [[ "${x[2]}" -eq "subscription_app" ]] && [[ -n $(echo "${x[*]}"|grep CustomCDRInterceptor) ]]; then
                echo "${x[*]}"
            fi;
        done < log
    done

(15:37:14\[D@DeCoWork15)
[~/Desktop]$ bash attempt.sh
15-Feb-2011 20:56:36,539|8273518145|subscription_app|-23e57aa%3A12e29c422b8%3A502a|ChargeAmount|CustomCDRInterceptor - CDR Info[Optional_Field1:,Subscription_Channel:Unknown,Optional_Field2:,Transaction_ID:,Content_ID:4945,IMEI:,Product_Name:VAS0003ALL,PPL_FLAG:,Charge_Code:,Base_Price:0.0,CustomerID:B_44445354,Circle_Name:GJ,Sender_MSISDN:,IMSI:405927121139030,Content_Status:,Location:GJ,Circle_ID:5,Original_Content_Owner_ID:,CPNAME:default_provider,Content_Price:0.0,Zone:Default,Content_Name:,Static_ID:GJ#32697724,External_Correlation_Id:-23e57aa%3A12e29c422b8%3A502a,Subscription_Type:RECURRING,MSISDN:8401131793,Transaction_Mode:Subscription,Transaction_DateTime:2011-02-15 20:56:36 GMT+05:30,Content_Type:,Sub_Profile:Pre-Paid,CPID:,Other_Info:]