查找文件中指定范围的特定数字的次数

查找文件中指定范围的特定数字的次数

我有一个文件,其中的数字用,(逗号)分隔。在其之间还包含一个数字范围,例如300-400.举例来说,我有一个文本文件,即testme.txt看起来像,

200,300,234,340-350,400,360,333-339
409-420
4444-31231231
348

我想知道号码是否348存在。 348 出现在 2 个地方:

  • 340-350
  • 在最后一行。

怎么找到呢?我尝试在 sed、awk 中使用regex,但我无法完全编写脚本来捕获数字范围。还有其他方法可以找到吗?

更新:找到了 1 个强力解决方案,并且它仅适用于范围。

count=0;
num1=348;
for i in `sed 's/\([0-9]\+\-[0-9]\+\)/:&:/g' testme.txt  | 
    awk -F: '{ for(i=1; i<=NF; i++) if($i ~/[0-9]+-[0-9]+/){print $i} }'`;      
do 
    lh=`echo $i | awk -F\- '{print $1}'`; 
    rh=`echo $i | awk -F\- '{print $2}'`;  
    if [ $lh -le $num1 -a $rh -ge $num1 ]; 
    then  
        count=`expr $count + 1`; 
    fi; 
done
echo $count;

答案1

一个 GNU awk 解决方案,将,or\n视为记录分隔符和-字段分隔符。根据字段数量应用相等检查或范围检查

awk -v num=348 -v RS=',|\n' -F'-' 'NF == 2 && $1 <= num && $2 >= num{c++};
           NF == 1 && $0 == num{c++};
           END{print c+0}' file
2

答案2

如果你可以使用perl

$ perl -F',' -anle '
for (@F) {
    ($l,$h) = split "-";                
    $count++ if $l == 348 || ($l < 348 and $h >= 348);
}
END {print $count}
' file
2

答案3

这个答案将提供领域包含指定的数字,而不仅仅是线,如果您需要该详细程度(并且数据中的范围可能包含重叠):

awk -v num=348 -F, '{
  for (i=1; i<=NF; i++) {
    if ($i == num || (split($i, a, /-/) == 2 && (a[1] <= num && num <= a[2]))) {
      print $i
    }
  }
}' <<END
200,300,234,340-350,400,360,333-339
409-420
4444-31231231
348
1-400,100-1000
END
340-350
348
1-400
100-1000

为了咯咯笑,打高尔夫球:

awk -F, '{for(i=1;i<=NF;i++)if($i==n||(split($i,a,/-/)==2&&a[1]<=n&&n<=a[2]))print $i}' n=348 file

答案4

此示例使用函数 match。

awk -F ',' '{num = 348; i = 0; while(i <= NF) {i++; match($i,/([0-9]+)-?([0-9]*)/,arr); if(arr[1] == num || (arr[1] <= num && num <= arr[2])){count++}}} END {print count}' file

相关内容