AWK добавляет цифры в число, которое представляет результат команды

69
4

Я пытаюсь изучить сценарии оболочки 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

Что я делаю неправильно?

спросил(а) 2019-04-10T21:46:00+03:00 1 год, 5 месяцев назад
1
Решение
92

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

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

иначе эхо "не имеет цифр"

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

./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

ответил(а) 2019-04-10T23:44:00+03:00 1 год, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема