samira
samira

Reputation: 399

Awk error inside bash shell script

I am trying to sort a two column file based on order of another file. With the following command :

  awk  'FNR == NR {lineno[$1] = NR; next} {print lineno[$1], $0;}'  associativity4Way_cacheSize32KB_replacementPolicy1.outs  associativity4Way_cacheSize32KB_replacementPolicy2.outs   | sort -k  1,1n  | cut -d " " -f2- > sorted

When I use AWK command outside shell it is working perfectly. Below is the head content of my files and the output:

this is head of "associativity4Way_cacheSize32KB_replacementPolicy2.outs "

LONG_MOBILE-10.bt9.trace.gz_a4_b64_c32  4.516192
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c32  4.147467
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  2.040121
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  1.837639
LONG_MOBILE-10.bt9.trace.gz_a4_b64_c64  3.068701
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.474358
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.545525
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c32  0.469907
LONG_MOBILE-11.bt9.trace.gz_a4_b64_c64  0.19461
...

And this is "ssociativity4Way_cacheSize32KB_replacementPolicy1.outs"

SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.869599
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.100611
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.068284
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  28.559002
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 21.332859
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.605805
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.256246
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.193713
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.119883
SHORT_MOBILE-22.bt9.trace.gz_a4_b64_c32 20.099358
...

output sorted perfectly as I wish:

SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  28.559002
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.068284
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.100611
SHORT_SERVER-2.bt9.trace.gz_a4_b64_c32  29.869599
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.193713
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 20.256246
SHORT_MOBILE-20.bt9.trace.gz_a4_b64_c32 21.332859
...

The problem appears when I try to place the awk command inside my bash script to be able do it for other files:

set lru = "associativity${a}Way_cacheSize${c}KB_replacementPolicy1.outs"


set policy = "associativity${a}Way_cacheSize${c}KB_replacementPolicy${r}.outs"


awk  "FNR == NR {lineno["$policy"] = NR; next} {print lineno["$policy"], "$lru";}" "$lru" "$policy" | sort -k 1,1n  | cut -d " " -f2- > "${policy}_sorted"

This is the error I get:

awk: cmd. line:1: FNR == NR {lineno[associativity4Way_cacheSize32KB_replacementPolicy3.outs] = NR; next} {print lineno[associativity4Way_cacheSize32KB_replacementPolicy3.outs], associativity4Way_cacheSize32KB_replacementPolicy1.outs;}
awk: cmd. line:1:                                                                                                                                                                                                                  ^ syntax error

I also tried this ( suggested by one answer here) but the output is not correct. It is printing the name of 'lru' file multiple times in the output file.

set lru = "associativity${a}Way_cacheSize${c}KB_replacementPolicy1.outs"
            set policy = "associativity${a}Way_cacheSize${c}KB_replacementPolicy${r}.outs"
            awk -v policy="$policy" -v lru="$lru" 'FNR == NR {lineno[policy] = NR; next} {print lineno[policy], lru}' "$lru" "$policy"  | sort -k 1,1n  | cut -d ' ' -f2- > "${policy}_sorted"


 associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs
associativity8Way_cacheSize64KB_replacementPolicy1.outs

Can someone advise where I am wrong here?

Upvotes: 0

Views: 834

Answers (1)

Ed Morton
Ed Morton

Reputation: 203209

Never enclose any script (awk sed, whatever) in double quotes as it just introduces complexity and fragility.

Change this:

awk "FNR == NR {lineno["$policy"] = NR; next} {print lineno["$policy"], "$lru";}" "$lru" "$policy"

to this:

awk -v policy="$policy" -v lru="$lru" 'FNR == NR {lineno[policy] = NR; next} {print lineno[policy], lru}' "$lru" "$policy"

and see how it goes. Get the book Effective Awk Programming, 4th Edition, by Arnold Robbins to start to learn about awk.

Upvotes: 2

Related Questions