我使用AWK脚本创建了一个Bash脚本来读取带有网络ping的文件,然后计算TCP协议获得的参数,如timeout和estimatedRTT。
我将它插入for循环中以读取文件夹中的所有文件,但它会抛出无法读取的错误。这是代码:
for f in *.txt
do awk '
function abs(v) {return v < 0 ? -v : v}
BEGIN {
alpha=0.125;
beta=0.25;
}
FNR == 1 {
sampleRTT=$1;
estimatedRTT=SampleRTT;
devRTT=0.0000;
timeoutInterval=EstimatedRTT;
printf("%f\t%f\t%f\n", sampleRTT, estimatedRTT, timeoutInterval)}
FNR > 1{
sampleRTT=$1
estimatedRTT=((1-alpha)*estimatedRTT)+(alpha*sampleRTT);
devRTT=((1-beta)*devRTT)+(beta*(abs(sampleRTT-estimatedRTT)));
timeoutInterval=estimatedRTT+(4*devRTT);
printf("%f\t%f\t%f\n", sampleRTT, estimatedRTT, timeoutInterval)}' %f
done
我尝试使用$ f,&#39; $ f&#39;和&#34; $ f&#34;。没有用。只需一次读取单个文件。我没有删除文件,也没有在另一个文件夹中运行脚本。
答案 0 :(得分:2)
如果您只想使用AWK处理所有.txt
个文件,可以执行以下操作:
awk '...' *.txt
并且您不需要for
循环。
关于变量f
的建议选项:
%f
:显然无法正常工作,因为%
根本不是Bash运算符,而您实际上将%f
作为文件名传递给AWK '$f'
:显然不起作用,因为单引号会阻止变量替换,而您实际上将$f
作为文件名传递给AWK $f
:有效,如果文件名包含无空格字符,无空格字符(例如{{1} }和*
),以及没有其他可扩展字符(例如?
)。通常一定要避免取消引用变量而不用双引号括起来。~
:无论如何,唯一正确取消引用(即获取值)变量因此,您应该在"$f"
循环中使用"$f"
,如果它仍然不起作用,则错误必须在其他位置。
如果错误消息是:
for
然后当前目录中没有awk: fatal: cannot open file `*.txt' for reading (No such file or directory)
文件,Bash使用.txt
作为传递给AWK的文件名。
您可以通过启用glob扩展验证来阻止此常见问题:
*.txt
在这种情况下,如果没有匹配glob shopt -s nullglob
的文件,则Bash不会将任何文件名传递给AWK。
答案 1 :(得分:1)
我在不同的场景中遇到了同样的问题。但是,在添加一行以更改目录到文件所在的文件夹后,awk
运行良好。
#!/bin/bash
cd /folder/where/your/files/are/located
#rest of the code
这可能不是问题的答案,但希望能节省一些人的时间。