lightsnail
lightsnail

Reputation: 788

Output the result of each loop in different columns

price.txt file has two columns: (name and value)

Mary 134
Lucy 56
Jack 88

range.txt file has three columns: (fruit and min_value and max_value)

apple 57 136
banana 62 258
orange 88 99
blueberry 98 121

My aim is to test whether the value in price.txt file is between the min_value and max_value in range.txt. If yes, putout 1, If not, output "x".

I tried:

awk 'FNR == NR { name=$1; price[name]=$2; next} { 
     for (name in price) { 
         if ($2<=price[name] && $3>=price[name]) {print 1} else {print "x"}
     } 
 }' price.txt range.txt

But my results are all in one column, just like follows:

1
1
x
x
x
x
x
x
1
1
1
x

Actually, I want my result to be like: (Each name has one column)

1 x 1
1 x 1
x x 1
x x x

Because I need to use paste to add the output file and range.txt file together. The final result should be like:

apple 57 136 1 x 1
banana 62 258 1 x 1
orange 88 99 x x 1
blueberry 98 121 x x x

So, how can I get the result of each loop in different columns? And is there anyway to output the final result without paste based on my current code? Thank you.

Upvotes: 0

Views: 58

Answers (1)

ocurran
ocurran

Reputation:

This builds on what you provided,

# load prices by index to maintain read order
FNR == NR {
    price[names++]=$2
    next
}
# save max index to avoid using non-standard length(array)
END {
    names=NR
}
{
 l = $1 " " $2 " " $3
 for (i=0; i < names; i++) {
     if ($2 <= price[i] && $3 >= price[i]) {
             l = l " 1"
     } else {
             l = l " x"
    }
 }
 print l
}

and generates output,

apple 57 136 1 x 1
banana 62 258 1 x 1
orange 88 99 x x 1
blueberry 98 121 x x x

However, you don't have the person name for the score (anonymous results) - maybe that's intentional?

The change here is to explicitly index array populated in first block to maintain order.

Upvotes: 1

Related Questions