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
的最终结果?谢谢。
答案 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
但是,你没有得分的人名(匿名结果) - 也许这是故意的?
此处的更改是显式索引在第一个块中填充的数组以维持顺序。