2017-01-30 5 views
0

У меня есть файл содержит числа. где мне нужно пройти цикл и проверить, состоит ли каждый номер в файле из 11 цифр. , если найденное число состоит из менее 11 цифр, тогда это число должно быть записано в выходной файл.проверить количество цифр в числе

Вот моя попытка:

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

Когда я запускаю мой код, я получаю следующее сообщение об ошибке:

-bash: [11: command not found

+1

Вы пытались добавить пробел между '' и '' ''? –

+0

Да, но я получаю '' '' -bash: [: missing '] '' '' ' – Fshamri

+1

И с пробелом перед закрытием'] '? –

ответ

1

Unix использует -eq для сравнения чисел. «==» используются для строк. И я думаю, вы можете избежать большинства точек с запятой.

Так что ваш сценарий должен быть:

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

Update

Если вам нужны элементы, которые не равны (больше или меньше) 11, просто измените условие [ ${#numbers} -ne 11 ]


Update 2: Adding additional checks:

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 

Надеюсь, что это h ELPS!

+0

хочу, чтобы все числа имели меньше или больше 11 цифр в одном внешнем файле – Fshamri

+0

' '' 'if [! $ {# numbers} -eq 11]; '' '' help – Fshamri

+0

см. обновленный ответ. вы можете просто использовать '-ne' вместо' -eq' – anacron

0

Вы говорите, что номер должен быть записан в выходной файл, если он не состоит из 11 цифр. Вы должны инвертировать логику.

Так как вы, кажется, используют Баш, один из многих способов сделать это было бы

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

Обратите внимание, что это будет рассматривать 00000000001 как 11-значный-номер. В вашей публикации не выясняется, действительно ли это то, чего вы хотите достичь.

Обратите внимание, что это решение, как и ваш подход, не проверяет, действительно ли данные являются числом. Строка из 11 букв также будет считаться номером.

Конечно, вы можете также избавиться от петли полностью написав

grep -vE '^.{11}$' >num.txt 

Если вы хотите также проверить числа и отфильтровать нецифровые, вы могли бы сделать

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

I например, использовать двойные негативы при тестировании номеров, чтобы нечетные числа были правильно отклонены:

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

Я немного изменил имена переменных, так как у вас были множественные «числа», относящиеся к каждому отдельному номеру. Этот код имеет единственное значение $number, чтобы указать каждую итерацию из входного файла. Я также использовал математику, чтобы убедиться, что мы только подсчитываем числа с одиннадцатью цифрами (больше или равными 10000000000), но затем используем тот же расчет переменной длины, что и исходный вопрос, когда дело касается отображения вывода.

Я предполагаю, что вы не хотите переписывать файл каждый раз, поэтому я переместил ваш вывод за пределы цикла.Вы также можете использовать >> num.txt в конце эхо-строки, но это фактически откроет файл один раз за номер во входном файле, что неэффективно.

Код, который я написал здесь, также совместим с POSIX (нет bashisms, он отлично работает в dash). Обратите внимание, что старые коммерческие UNIX могут жаловаться на цифры, большие, чем 2³¹ (максимальное 32-битное целое число).

Смежные вопросы