ella
ella

Reputation: 55

How to write a code for more than one file in awk

I wrote a script in AWK called exc7 ./exc7 file1 file2 In every file there is a matrix

file1 :
2 6 7
10 5 4
3 8 4
file2:
-60 10
10   -60

The code that I wrote is :

#!/usr/bin/awk -f
{
for (i=1;i<=NF;i++)
A[NR,i]=$i
}
END{
for (i=1;i<=NR;i++){
sum += A[i,1]
}
for (i=1;i<=NF;i++)
sum2 += A[1,i]
for (i=0;i<=NF;i++)
sum3 += A[NR,i]
for (i=0;i<=NR;i++)
sum4 += A[i,NF]
print sum,sum2,sum3,sum4
if (sum==sum2 && sum==sum3 && sum==sum4) 
print "yes"
}

It should check for every file if the sum of the first column and the last and the first line and the last is the same. It will print the four sum and say yes if they are equal.Then it should print the largest sum of all number in all the files. when I try it on one file it is right like when I try it on file1 it prints:

15 15 15 15
yes

but when I try it on two or more files like file1 file 2 the output is :

-35 8 -50 -31

Upvotes: 0

Views: 68

Answers (1)

karakfa
karakfa

Reputation: 67507

you should use FNR instead of NR and with gawk you can use ENDFILE instead of END. However, this should work with any awk

awk 'function sumline(last,rn) {n=split(last,lr); 
                                for(i=1;i<=n;i++) rn+=lr[i]; 
                                return rn}
     function printresult(c1,r1,rn,cn) {print c1,r1,rn,cn; 
                                        print (r1==rn && c1==cn && r1==c1)?"yes":"no"}

     FNR==1{if(last)
               {rn=sumline(last);
                printresult(c1,r1,rn,cn)}
            rn=cn=c1=0;
            r1=sumline($0)}
           {c1+=$1;cn+=$NF;last=$0}
     END   {rn=sumline(last);
            printresult(c1,r1,rn,cn)}' file1 file2

15 15 15 15
yes
-50 -50 -50 -50
yes

essentially, instead of checking end of file, you can check start of the file and print out the previous file's results. Need to treat first file differently. You still need the END block to handle the last file.

UPDATE

Based on the questions you asked, I think it's better for you to keep your script as is and change the way you call it.

for file in file1 file2; 
    do echo "$file"; ./exc7 "$file";       
    done

you'll be calling the script once for each file, so all the complications will go away.

Upvotes: 2

Related Questions