AWK добавляет цифры в число, которое представляет результат команды - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь изучить скрипты bash и awk, и я написал некоторый простой код, который перебирает заданные аргументы, и если парамсы содержат цифры, я печатаю только цифры.

Далее, используя AWK, я бы добавил их один за другим и напечатал сумму. И я застрял здесь. Это мой код:

#!/bin/bash

for user in "$@"
do
  echo "$user"
  if [[ $user =~ [0-9]+ ]]; then
    usersDigits=$(echo $user | tr -dc '0-9')
    echo "$usersDigits"
    echo "has digits"
    echo $(awk '{ sum+=$usersDigits } END { print sum }')
  else
    echo "doesn't have digits"
  fi
done

Что я делаю не так?

1 Ответ

0 голосов
/ 10 апреля 2019

1) Ваш код застрянет, поскольку awk ожидает входной файл или данные из STDIN.Вы можете добавить / dev / null, если не хотите обрабатывать какие-либо файлы.Вы можете прочитать этот вопрос SO , чтобы понять больше об этом.

2) Даже если вы исправите это, сумма не будет вычислена, так как переменная сумма будет сбрасываться во время каждого цикла, как считает awkэто как новая переменная.

Обратите внимание на разницу в выходных данных в следующих 3 попытках:

for user in "$@"
do
  printf "\nUser: $user \n"
  if [[ $user =~ [0-9]+ ]]; then
    usersDigits=$(echo $user | tr -dc '0-9')
    echo "$usersDigits"
    echo "has digits"
    printf "First Try : " &&  awk 'END {print $usersDigits}' < /dev/null
    printf "Second Try : " &&  awk 'END {print "$usersDigits"}' < /dev/null
    printf "Third Try : " && awk -v dg="$usersDigits" 'BEGIN {printf "Digits= " dg; sum+=dg; print "  Sum= " sum}'
  else
    echo "doesn't have digits"
  fi
done

Вывод для "test.ksh acs acs005 acs007":

User: acs
doesn't have digits

User: acs005
005
has digits
First Try :
Second Try : $usersDigits
Third Try : Digits= 005  Sum= 5

User: acs007
007
has digits
First Try :
Second Try : $usersDigits
Third Try : Digits= 007  Sum= 7

В первых двух, usersDigits не определен внутри awk.Надеюсь, это поможет.

Обновление: скрипт с логикой для вычисления суммы цифр

for user in "$@"
do
 printf "\nUser: $user \n"
 if [[ $user =~ [0-9]+ ]]; then
  usersDigits=$(echo $user | tr -dc '0-9')
  echo "$usersDigits"
  echo "has digits"
printf "Sum of Digits:" && awk -v dg="$usersDigits" 'BEGIN {while( dg+0 > 0) {digit=dg%10; DigSum+=int(digit); dg=int(dg/10);}; print DigSum }' < /dev/null

иначе echo "не имеет цифр" fi done

Пример вывода:

./test.ksh acs acs005 acs007 acs123 345

User: acs
doesn't have digits

User: acs005
005
has digits
Sum of Digits:5

User: acs007
007
has digits
Sum of Digits:7

User: acs123
123
has digits
Sum of Digits:6

User: 345
345
has digits
Sum of Digits:12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...