匹配两个数字文件以超出范围和范围内

Posted

技术标签:

【中文标题】匹配两个数字文件以超出范围和范围内【英文标题】:Match two number files to get out of range and within a range 【发布时间】:2017-06-20 17:49:33 【问题描述】:

我有两个输入文件:

cat 2OCS_VOICECALLS_1111_11_111111
111111111   902123124  201605240534270000000070OCS0144 01.0946  0.3729
111111111   902123125  201605222207410000000070OCS8182 00.8980     0.1
111111111   902123126  201605222319190000000015OCS1573 6.3854     6.11
111111111   902123126  201605230752420000000080OCS1223 00.8002     0.0
111111111   902123123  201605231525320000000073OCS1394 01.2194     0.4
111111111   902123123  201605231708080000000570OCS1040 011.1977    6.3
111111111    350       201605240042070000000236OCS4252 3.6344     1.55
111111111    1         201605240114430000000123OCS1154 03.0537    1.89
111111111    3         201605240246070000000009OCS0707 018.6965   18.4
111111111    423       201605240530500000000213OCS0130 01.8881    0.00
111111111    5         201605240530500000000213OCS0130 01.8881    0.00
111111111    470       201605240601120000000015OCS0156 015.8059   15.5
111111111    600       201605240601120000000015OCS0156 015.8059   15.5
111111111    400       201605240601120000000015OCS0156 015.8059   15.5

另一个文件

cat BlackList_B_Number.dat
902123123   902123125
902123127   902123128
450               600
1                 400

我希望匹配超出数字范围并在不同文件的范围内。我试过这个:

awk -v FILE1="FILE1.out" -v FILE2="FILE2.out" 'NR==FNRfor (i=$1; i<=$2; i++) wanted[i] ;next($2 in wanted)print > FILE1!($2 in wanted)print > FILE2' BlackList_B_Number.dat 2OCS_VOICECALLS_1111_11_111111

但我没有得到预期的输出,因为902123124 应该在FILE1 中,而不是在FILE2 中:

cat FILE1.out
111111111   902123123  201605231525320000000073OCS1394 01.2194     0.4
111111111   902123123  201605231708080000000570OCS1040 011.1977    6.3
111111111    350       201605240042070000000236OCS4252 3.6344     1.55
111111111    1         201605240114430000000123OCS1154 03.0537    1.89
111111111    3         201605240246070000000009OCS0707 018.6965   18.4
111111111    5         201605240530500000000213OCS0130 01.8881    0.00
111111111    470       201605240601120000000015OCS0156 015.8059   15.5
111111111    600       201605240601120000000015OCS0156 015.8059   15.5
111111111    400       201605240601120000000015OCS0156 015.8059   15.5

cat FILE2.out
111111111   902123124  201605240534270000000070OCS0144 01.0946  0.3729
111111111   902123125  201605222207410000000070OCS8182 00.8980     0.1
111111111   902123126  201605222319190000000015OCS1573 6.3854     6.11
111111111   902123126  201605230752420000000080OCS1223 00.8002     0.0
111111111         423  201605240530500000000213OCS0130 01.8881    0.00

【问题讨论】:

无法在GNU Awk 4.1.4 上重现它,我可以看到902123124 出现在FILE1 该脚本不能根据这些输入文件执行您声称的操作。尝试在每个文件上运行 cat -v 以查看是否包含任何控制字符。使用您发布的内容再试一次,再看看您的真实数据。 【参考方案1】:
awk -v FILE1="FILE1.out" -v FILE2="FILE2.out" '
     FNR==NR BLs[++BSize]=$1;BHs[BSize]=$2;next
     
     Blacked=0
     for( i=1; i<BSize && ! Blacked; i++) Blacked = ( $2 >= BLs[i] && $2 <= BHs[i])
#print "DEBUG:: " FNR ": Blacked: " Blacked " : " $0
     if ( Blacked ) print > FILE2
      else print > FILE1
     ' BlackList_B_Number.dat 2OCS_VOICECALLS_1111_11_111111

您不检查版本中 2 值之间的值,但如果列出的值的一部分(您指定 between,我假设边缘包含在 between )

说明: - 通过读取第一个文件(黑名单)加载 2 个数组用于限制规范,1 个表示低位,1 个表示高位 - 读取下一个文件(数据) - 比较每一行的数字是否在每个指定的限制之间(如果有,则在第一次点击时停止)并定义是否涂黑 - 根据 Balcked 状态,打印到文件 1 或 2

【讨论】:

非常感谢 NeronLeVelu !!!。看起来真的很好,但我跑不起来。我得到错误: > FNR=NR BLs[++BSize]=$1;BHs[BSize]=$2;next > > Blacked=0 > for( i=1; i= BLs[i] && $2 if Blacked print > FILE2 > else print FILE1 > ' BlackList_B_Number.dat 2OCS_VOICECALLS_1111_11_111111 error de sintaxis La línea de origen es 6. El contexto del error es if >>> Blacked FILE2 awk: La sentencia no se puede analizar correctamente。 La linea de origen es 6. 抱歉 2 个小错误(FNR=NR -> FNR==NR 和 > 在第二次打印之前)。已更正 而且.. 只是它会很棒... 我怎样才能将以前的脚本改编为 program.awk。例如:awk -f Program.awk BlackList_B_Number.dat OCS_VOICECALLS_1111_11_111111 Program.awk: ------------ BEGIN FIN 只需将代码保留在最后两个 ' 之间,不带引号(因此从 FNR== 开始)在文件中(例如:YourCode.awk)并使用相同的参数 + -f YourCode.awk 调用它但最好将它保存在一个批处理中并使用参数调用该批处理

以上是关于匹配两个数字文件以超出范围和范围内的主要内容,如果未能解决你的问题,请参考以下文章

Angular - 防止在输入类型=“数字”中输入超出范围的数字

科学记数法超出toPrecision范围怎么办

搜索字符串时向量下标超出范围

索引超出范围但实际上在范围内[关闭]

从数组中删除重复项时出现超出范围异常

JAVA猜数字游戏显示的提示的范围越来越小