首页 > 解决方案 > AWK 在代表命令结果的数字中添加数字

问题描述

我正在尝试学习 bash shell 脚本和 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

我究竟做错了什么?

标签: bashshellawk

解决方案


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

2) 即使您更正了,也不会计算 sum,因为变量 sum 将在每个循环期间重置,因为 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

在前两个中,userDigits 在 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

else echo "没有数字" fi 完成

样本输出:

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

推荐阅读