bash - 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
我究竟做错了什么?
解决方案
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
推荐阅读
- coldfusion - ColdFusion FarCry CMS 安装问题
- java - 在java中以金字塔模式打印XO?
- android - 某些 unicode 字符无意中被转换为 Android TextView 中的标志表情符号
- c# - C# 字符串到所有样式或文化的十进制
- php - PHP 函数 stripcslashes 未按要求转换
- java - 整数的反转数字:如何找出数字是否溢出?
- sql - 使用 MAX() 和 VALUES() 优化 SQL 语句
- mysql - 如何将视图导出和导入到表不同的数据库中
- prestashop-1.7 - Prestashop Bug sur le nom du produit de mon 电子邮件中断库存
- oracle - Oracle SQL - 如何使用分页遍历记录?