在不同的列

时间:2016-09-16 15:18:34

标签: awk

price.txt文件有两列:(名称和值)

Mary 134
Lucy 56
Jack 88

range.txt文件有三列:( fruit和min_value和max_value)

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

我的目的是测试price.txt文件中的值是否在range.txt中的min_value和max_value之间。如果是,则输出1,否则输出"x"

我试过了:

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

但我的结果都在一栏中,如下所示:

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

实际上,我希望我的结果如下:(每个名称都有一列)

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

因为我需要使用paste将输出文件和range.txt文件一起添加。最终结果应该是:

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

那么,我怎样才能在不同的列中得到每个循环的结果?无论如何根据我当前的代码输出没有paste的最终结果?谢谢。

1 个答案:

答案 0 :(得分:1)

这基于您提供的内容,

# 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
}

并生成输出

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

但是,你没有得分的人名(匿名结果) - 也许这是故意的?

此处的更改是显式索引在第一个块中填充的数组以维持顺序。