我有一个带有特定值(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.所以显然我做错了。我很感激任何建议。
答案 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
您可能需要更改区域设置以使用,
作为小数点分隔符。此外,代码假设每个组编号有一对范围(因此索引范围包含组编号),如果不是,则需要按行编号索引并保持映射到行编号到组编号。