2017-06-20 268 views
0

我用AWK脚本创建了一个Bash脚本来读取网络ping文件,然后计算TCP协议获取的参数如超时和估计的RTT。“awk fatal无法打开文件进行读取(没有这样的文件或目录)”在for循环bash脚本中

我将它插入到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,'$ f'和“$ f”。没有作品。只需一次读取单个文件即可。我没有删除这些文件,也没有在另一个文件夹中运行该脚本。

+1

尝试用双引号括住'$ f':'“$ f”' –

+0

Alredy尝试过。不起作用。 – MasterGeekMX

+0

它必须!尝试在'awk'之前添加'echo'$ f“;'... –

回答

1

如果你只是想处理所有.txt文件与AWK,你可以这样做:

awk '...' *.txt 

,你不需要for循环。


关于你提出的变量f选项:

  • %f:显然不起作用,因为%是不是一个Bash的运营商所有,而你从字面上传递%f作为文件名AWK
  • '$f':显然不起作用,因为单引号会阻止变量替换,而你字面上通过$f作为文件名AWK
  • $f工作,如果文件名包含没有空格字符,没有通配符字符(如*?),和没有其它可膨胀字符(如~)。一般情况下,请尽量避免取消引用变量而不用双引号括起来。
  • "$f"作品在任何情况下,是唯一正确途径取消引用(即获得的值)的变量

所以,你应该在你的for循环使用"$f",如果仍然不起作用,错误必须在其他地方。


如果错误信息是:

awk: fatal: cannot open file `*.txt' for reading (No such file or directory) 

那么你有没有.txt文件在当前目录和Bash使用*.txt传递给AWK的文件名。

您可以通过启用水珠扩展验证防止这个共同的问题:

shopt -s nullglob 

在这种情况下,如果没有匹配的水珠*.txt文件,然后击不传递任何向AWK。

+1

@EdMorton我关注的是原则上可以使脚本工作的选项,但我完全同意,在解引用时,变量应该总是用双引号括起来(除非在一些罕见的特殊情况下引用可能实际上会干扰预期的行为)。我相应地编辑了我的答案。 – weibeld

相关问题