如果在使用shell脚本的范围内,请检查另一个文件中的编号

如果在使用shell脚本的范围内,请检查另一个文件中的编号,shell,unix,awk,sed,grep,Shell,Unix,Awk,Sed,Grep,我有两个文件fileA和fileB。FileA包含数字列表,fileB包含数字范围 菲拉 文件范围从和范围到 22400208, 22400208 446646450, 446646450 63495980000, 63495989999 输出必须是 63495980020 在sql脚本中,它就像 select * from fileB where 446646452 between Range_from and Range_To 如何使用shell脚本来完成

我有两个文件fileA和fileB。FileA包含数字列表,fileB包含数字范围

菲拉

文件范围从和范围到

  22400208, 22400208
  446646450,    446646450
  63495980000,  63495989999
输出必须是

  63495980020
在sql脚本中,它就像

 select *
 from fileB
 where 446646452 between Range_from and Range_To
如何使用shell脚本来完成它

打印与任何范围匹配的数字 请注意,仅打印63495980020。446646452不在22400208和22400208之间,因此省略它

工作原理 实用程序“粘贴”组合了如下文件:

$ paste fileA fileB 
  446646452       22400208, 22400208
  000000001       446646450,    446646450
  63495980020     63495980000,  63495989999
$1>$2+0
第一列是我们感兴趣的数字,第二列是范围的低值,第三列是高值。如果第一个值介于第二个值和第三个值之间,我们希望打印第一个值$1。为了测试它是否大于第二个,我们可以尝试:

$1>$2
但是,为了确保awk将字段视为数字而不是字符串,我们对其中一个数字执行如下加法:

$ paste fileA fileB 
  446646452       22400208, 22400208
  000000001       446646450,    446646450
  63495980020     63495980000,  63495989999
$1>$2+0
同样,要测试第一个数字是否小于第三个数字:

$1<$3+0
将这两个测试与一个print命令放在一起,可以得到:

$1>$2+0 && $1<$3+0 {print $1}
此测试严格在两个测试之间进行。根据您的要求,您可能更喜欢:

$1>=$2+0 && $1<=$3+0 {print $1}
打印与任何范围匹配的数字 请注意,仅打印63495980020。446646452不在22400208和22400208之间,因此省略它

工作原理 实用程序“粘贴”组合了如下文件:

$ paste fileA fileB 
  446646452       22400208, 22400208
  000000001       446646450,    446646450
  63495980020     63495980000,  63495989999
$1>$2+0
第一列是我们感兴趣的数字,第二列是范围的低值,第三列是高值。如果第一个值介于第二个值和第三个值之间,我们希望打印第一个值$1。为了测试它是否大于第二个,我们可以尝试:

$1>$2
但是,为了确保awk将字段视为数字而不是字符串,我们对其中一个数字执行如下加法:

$ paste fileA fileB 
  446646452       22400208, 22400208
  000000001       446646450,    446646450
  63495980020     63495980000,  63495989999
$1>$2+0
同样,要测试第一个数字是否小于第三个数字:

$1<$3+0
将这两个测试与一个print命令放在一起,可以得到:

$1>$2+0 && $1<$3+0 {print $1}
此测试严格在两个测试之间进行。根据您的要求,您可能更喜欢:

$1>=$2+0 && $1<=$3+0 {print $1}

根据OP的说明,应对照fileB中的所有范围检查fileA中的每个值,以查看其是否至少属于一个范围。
>=和根据OP的澄清,应对照文件B中的所有范围检查文件A中的每个值,以查看其是否至少属于一个范围。 >=和旧时尚脚本

sed 's/,[[:space:]]*/ /' fileB \
 | while read LowVal HighVal
    do
      while read ThisLine
       do
         [ ${ThisLine} -ge ${LowVal} ] && [ ${ThisLine} -le ${HighVal} ] && echo "${ThisLine}"
       done < fileA
    done
旧式剧本

sed 's/,[[:space:]]*/ /' fileB \
 | while read LowVal HighVal
    do
      while read ThisLine
       do
         [ ${ThisLine} -ge ${LowVal} ] && [ ${ThisLine} -le ${HighVal} ] && echo "${ThisLine}"
       done < fileA
    done

将fileB读入两个awk数组,从和到。然后,在读取fileA时,在from/to数组上循环。如果当前值介于两者之间,请打印。请尝试使用该提示自己编写。因此,这不是一个免费的编码服务,你应该发布你的代码,我们会帮助你修复它。fileB前两行的from和to值是相同的-这是故意的吗?fileA的行只需要对照fileB对应行的单个范围检查,还是对照所有范围检查,即。,如果它至少属于一个范围,则应对照所有范围检查?将文件B放入两个awk数组,从和到。然后,在读取fileA时,在from/to数组上循环。如果当前值介于两者之间,请打印。请尝试使用该提示自己编写。因此,这不是一个免费的编码服务,你应该发布你的代码,我们会帮助你修复它。fileB前两行的from和to值是相同的-这是故意的吗?fileA的行只需要对照fileB对应行的单个范围检查,还是对照所有范围检查,即。,如果它至少在一个范围内?应该对照所有范围进行检查您得到了点,但是值应该对照所有范围进行检查,而不仅仅是在其对应的行中。@新手如果是这样,那么为什么预期的输出包括63495980020?它不在22400208到22400208的范围内。+您已经得到了点,但是应该对照所有范围检查值,而不仅仅是在其对应的行中。@newbie如果是这样,那么为什么预期的输出包括63495980020?它不在22400208到22400208的范围内。+我尝试了这个脚本,问题是当fileA的值等于fileB的范围时,它不会打印。@newbie:我通过确保将所有令牌都作为数字处理,使脚本更加健壮,也许这会有帮助-再试一次。从你的问题来看,不清楚是否有前导空格。我尝试了这个脚本,问题是当fileA的值等于fileB的range_From时,它不会打印出来。@newbie:我通过确保将所有标记都作为数字处理,使脚本更加健壮,也许这会有帮助-再试一次。从你的问题来看,不清楚是否有前导空格。