Bash 脚本,从文件中读取
Bash Scripting, Reading From A File
我正在尝试从我的 .txt 文件中 select 以 F 开头的行,然后找到数字的平均值,这是我的代码,我不知道为什么它没有加起来.
#!/bin/bash
function F1()
{
count=1;
total=0;
file='users.txt'
while read line; do
if (grep \^"F");
then
for i in $( awk '{ print ; }')
do
total=$(echo $total+$i )
var=$((var+1))
done
fi
echo "scale=2; $total / $count"
echo $line
done < $file
}
F1
my output
您没有对变量 total
执行加法运算。在第一次迭代中,行
total=$(echo $total+$i )
(假设 i
,例如,是 4711)扩展为
total=0+4711
因此变量 total 被设置为 6 个字符的字符串,而不是数字。要在此处实际添加,您必须编写
((total = total + i))
如果您无论如何都在使用 Awk,请使用它的功能。
awk '/^F/ { sum+=; count++ } END { print (count ? sum/count : 0) }' users.txt
这是一个标准的 Awk 习语,通常是在任何慢节奏的 Awk 初学者基础教程的第一个小时内的练习,或者在更有针对性的学习后的十分钟内练习。
您的 shell 脚本至少有以下错误;
没有参数的 grep
将一次性读入其余的输入行。 运行 它在子shell(即括号内)中没有任何用处,并且会花费您一个过程。
- 除非您单独请求,否则shell不执行任何运算;变量只是字符串。如果你想添加两个数字,你需要明确地使用像
((total+=i))
这样的算术评估......就像你已经在另一个地方所做的那样。
read
没有任何选项会破坏您输入中的反冲;如果您不特别需要此行为,则应始终使用 read -r
.
- 除其中一个分号外,其他分号均无用。
- 您通常应该引用所有变量;见 When to wrap quotes around a shell variable
- 如果您无论如何都在使用 Awk,您应该尽可能多地使用它。 shell 在逐行处理文件时非常缓慢且效率低下,而在整数运算时非常笨拙(更不用说除以彼此不是偶数倍数的数字了)。
这可能不完整;在寻求人工帮助之前也可以尝试 http://shellcheck.net/。
在 Stack Overflow 上,尽量减少您的问题,使其真正只问一个问题。所有这些问题都有重复的问题,但我只是将其标记为与您实际询问的问题重复。
我正在尝试从我的 .txt 文件中 select 以 F 开头的行,然后找到数字的平均值,这是我的代码,我不知道为什么它没有加起来.
#!/bin/bash
function F1()
{
count=1;
total=0;
file='users.txt'
while read line; do
if (grep \^"F");
then
for i in $( awk '{ print ; }')
do
total=$(echo $total+$i )
var=$((var+1))
done
fi
echo "scale=2; $total / $count"
echo $line
done < $file
}
F1
my output
您没有对变量 total
执行加法运算。在第一次迭代中,行
total=$(echo $total+$i )
(假设 i
,例如,是 4711)扩展为
total=0+4711
因此变量 total 被设置为 6 个字符的字符串,而不是数字。要在此处实际添加,您必须编写
((total = total + i))
如果您无论如何都在使用 Awk,请使用它的功能。
awk '/^F/ { sum+=; count++ } END { print (count ? sum/count : 0) }' users.txt
这是一个标准的 Awk 习语,通常是在任何慢节奏的 Awk 初学者基础教程的第一个小时内的练习,或者在更有针对性的学习后的十分钟内练习。
您的 shell 脚本至少有以下错误;
-
没有参数的
grep
将一次性读入其余的输入行。 运行 它在子shell(即括号内)中没有任何用处,并且会花费您一个过程。- 除非您单独请求,否则shell不执行任何运算;变量只是字符串。如果你想添加两个数字,你需要明确地使用像
((total+=i))
这样的算术评估......就像你已经在另一个地方所做的那样。 read
没有任何选项会破坏您输入中的反冲;如果您不特别需要此行为,则应始终使用read -r
.- 除其中一个分号外,其他分号均无用。
- 您通常应该引用所有变量;见 When to wrap quotes around a shell variable
- 如果您无论如何都在使用 Awk,您应该尽可能多地使用它。 shell 在逐行处理文件时非常缓慢且效率低下,而在整数运算时非常笨拙(更不用说除以彼此不是偶数倍数的数字了)。
这可能不完整;在寻求人工帮助之前也可以尝试 http://shellcheck.net/。
在 Stack Overflow 上,尽量减少您的问题,使其真正只问一个问题。所有这些问题都有重复的问题,但我只是将其标记为与您实际询问的问题重复。