AWK在代表命令结果的数字中添加数字

时间:2019-04-10 18:46:27

标签: bash shell awk

我正在尝试学习bash shell脚本和awk,我编写了一些简单的代码,这些代码循环遍历给定的参数,并且如果params包含数字,则仅打印数字。

接下来,使用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 :(得分:0)

1)您的代码将被卡住,因为awk期望输入来自STDIN的文件或数据。如果不想处理任何文件,则可以添加/ dev / null。您可以阅读this SO question来了解更多信息。

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

在前两个中,awk内部未定义usersDigits。希望对您有所帮助。

更新: 具有逻辑运算符的脚本,用于计算数字总和

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