检查数字中的位数

时间:2017-01-30 10:21:48

标签: linux shell unix

我的文件包含数字。我必须循环并检查文件中的每个数字是否包含11位数。   如果找到的数字包含少于/超过11位数字,则应将此数字写入输出文件。

这是我的尝试:

number="$(< all_numbers.txt)"
for numbers in $number ;
do 
    if [${#numbers} == 11];
    then  
        echo $numbers = "${#numbers}" > num.txt;
    fi; 
done;

当我运行我的代码时,我收到以下错误:

  

-bash:[11:命令未找到

3 个答案:

答案 0 :(得分:1)

Unix使用-eq来比较数字。 &#34; ==&#34;用于字符串。 而且我认为你可以避免使用大多数分号。

所以你的脚本应该是:

number="$(< all_numbers.txt)"
for numbers in $number
do 
    if [ ${#numbers} -eq 11 ];  then  
        echo $numbers = "${#numbers}" > num.txt
    fi
done
  

<强>更新

如果您需要的元素不等于(大于或小于)11,只需将条件更改为[ ${#numbers} -ne 11 ]

  

更新2 :添加其他支票:

number="$(< all_numbers.txt)"
for numbers in $number
do 
    if [[ ! ${#numbers} =~ ^93 ]] ; then
        echo $numbers = "${#numbers}" > num93.txt
    fi
    if [ ${#numbers} -ne 11 ];  then  
        echo $numbers = "${#numbers}" > num.txt
    fi
done

希望这有帮助!

答案 1 :(得分:0)

如果由11位数组成,则表示该数字应写入输出文件。你必须颠倒逻辑。

由于您似乎使用bash,因此其中一种方法是

(( ${#numbers} == 11 )) || echo $number >num.txt

请注意,这会将00000000001视为11位数字。您的帖子并未说明这是否真的是您想要实现的目标。

另请注意,此解决方案与您的方法一样,不会检查数据是否真的是一个数字。一串11个字母也被视为数字。

当然你也可以通过写

完全摆脱循环
grep -vE '^.{11}$' >num.txt

如果您还想检查数字并过滤掉非数字,您可以

grep -vE '^[0-9]{11}$' >num.txt

答案 2 :(得分:0)

我喜欢在测试数字时使用双重否定,以便非数字被正确拒绝:

for number in $(cat all_numbers.txt)
do 
    if ! [ "$number" -lt 10000000000 ] 2>/dev/null
    then  
        echo "$number = '${#number}'"
    fi
done > num.txt

我已经更改了变量名称,因为您有一个复数“数字”表示每个单独的数字。此代码具有单数$number以指示输入文件中的每次迭代。我还使用数学来确保我们只计算11位数(大于或等于10000000000)的数字,但在显示输出时使用与原始问题相同的可变长度计算。

我猜你不想每次都覆盖这个文件,所以我把你的输出移到了循环之外。您也可以在回显行的末尾使用>> num.txt,但实际上在输入文件中每个数字都会打开一次文件,效率很低。

我在这里编写的代码也与POSIX兼容(没有bashisms,它在dash中工作正常)。注意,旧的商业UNIX可能会抱怨大于2³的数字(最大有符号32位整数)。