我有包含数字的文件。在这里,我必须循环并检查文件中的每个数字是否由11位数字组成。如果找到的数字包含小于/多于11位数字,则应将该数字写入输出文件。
以下是我的尝试:
number="$(< all_numbers.txt)"
for numbers in $number ;
do
if [${#numbers} == 11];
then
echo $numbers = "${#numbers}" > num.txt;
fi;
done;当我运行我的代码时,我会得到以下错误:
-bash:[11:找不到命令
发布于 2017-01-30 10:57:24
Unix使用-eq来比较数字。"==“用于字符串。我觉得你可以避开大部分分号。
所以你的剧本应该是:
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希望这能有所帮助!
发布于 2017-01-30 13:57:21
您说这个数字应该写到输出文件中,如果它这样做了,而不是由11位组成。你得颠倒逻辑。
由于您似乎使用bash,所以这样做的方法之一是:
(( ${#numbers} == 11 )) || echo $number >num.txt请注意,这将考虑00000000001为11位数。你的帖子并没有说明这是否真的是你想要达到的目标。
还请注意,与您的方法一样,此解决方案不检查数据是否真的是数字。11个字母的串也将被视为数字。
当然,您也可以通过编写
grep -vE '^.{11}$' >num.txt如果您也想检查数字和筛选出非数字,您可以这样做。
grep -vE '^[0-9]{11}$' >num.txt发布于 2017-01-31 22:16:23
我喜欢在测试数字时使用双底片,以便正确地拒绝非数字:
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兼容的(没有巴什,它在破折号中工作得很好)。注意,旧的商业UNIXes可能抱怨数字大于2立方(最大有符号32位整数)。
https://stackoverflow.com/questions/41933497
复制相似问题