" awk致命无法打开文件进行阅读(没有这样的文件或目录)"在bash脚本中的for循环中

时间:2017-06-20 06:38:14

标签: bash shell awk

我使用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;。没有用。只需一次读取单个文件。我没有删除文件,也没有在另一个文件夹中运行脚本。

2 个答案:

答案 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

这可能不是问题的答案,但希望能节省一些人的时间。