我的文件包含数字。我必须循环并检查文件中的每个数字是否包含11位数。 如果找到的数字包含少于/超过11位数字,则应将此数字写入输出文件。
这是我的尝试:
number="$(< all_numbers.txt)"
for numbers in $number ;
do
if [${#numbers} == 11];
then
echo $numbers = "${#numbers}" > num.txt;
fi;
done;
当我运行我的代码时,我收到以下错误:
-bash:[11:命令未找到
答案 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位整数)。