如何在给定的时间间隔内每行测试两个条目?

时间:2018-04-20 12:04:27

标签: linux bash awk

我有一个带有特定值(v1和v2)的参考文件 ref ,并且每个值都有一个上限(ub)和下限(lb bond)的间隔和一个组号(gn) )中所定义:

v1 v2 ub1   lb1   ub2 lb2 gn
50 25 51    49    26  24  1
86 13 86.5  85.5  14  12  2
...

现在我有一个文件 test 有很多行,每行的两个条目的值都在 ref 中定义的区间内。目标是为每一行分配与参考文件中的条目相对应的组号。

输入文件:

50.2 24.6
85.7 13.9
86.3 12.6

期望的输出:

50.2 24.6 1
85.7 13.9 2
86.3 12.6 2

到目前为止,我的方法是使用 bash awk 的代码:

while read line
do

lin=( ${line} )
rot=${lin[0]}
tilt=${lin[1]}

awk  -v line="${line}" -v rot="$rot"  -v tilt="$tilt" ' {if ((rot>$4) && (rot<$3) && (tilt>$6) && (tilt<$5)) {print line,$7} } ' reference >> output

done < test

但它不起作用,测试文件有130000行,但输出文件只有11000.所以显然我做错了。我很感激任何建议。

1 个答案:

答案 0 :(得分:0)

.用作小数点分隔符

$ awk 'NR==FNR && NR>1{ub1[$NF]=$3;lb1[$NF]=$4;ub2[$NF]=$5;lb2[$NF]=$6; next} 
                      {for(k in lb1) 
                         if(lb1[k]<$1 && $1<ub1[k] && 
                            lb2[k]<$2 && $2<ub2[k]) print $0, k}' file input
50.2 24.6 1
85.7 13.9 2
86.3 12.6 2

您可能需要更改区域设置以使用,作为小数点分隔符。此外,代码假设每个组编号有一对范围(因此索引范围包含组编号),如果不是,则需要按行编号索引并保持映射到行编号到组编号。