2017-06-20 95 views
0

ネットワークpingでファイルを読み込み、TCPプロトコルが取得するパラメータを計算するAWKスクリプトを使用してBashスクリプトを作成しました。タイムアウトとestimatedRTTのようなものです。"awkは読み込み用ファイルを開くことができません(そのようなファイルやディレクトリはありません)" 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つのファイルを読むだけで動作します。ファイルを削除したり、別のフォルダでスクリプトを実行したりしませんでした。

+1

'$ f'を二重引用符で囲みてください。' '$ f" ' –

+0

Alredyが試みました。動作しません。 – MasterGeekMX

+0

する必要があります! '' awk'の前に '' echo "$ f"; 'を追加してみてください... –

答えて

1

あなたは、単にAWKを持つすべての.txtファイルを処理したい場合は、あなたが行うことができます:

awk '...' *.txt 

、あなたはforループを必要としません。

  • %f%は全くバッシュ演算子ではないのではっきりは、動作しない、とあなたは文字通りファイル名として%fを渡す変数fのためのあなたの提案の選択肢について


    AWKへ

  • '$f':明らかには、一重引用符が変数置換を妨げるため、が機能しません。文字通りAWK
  • $fにファイル名として$fを渡す:作品、ファイル名はない空白文字、(例えば*?など)ないグロブ文字、及びない他の拡張可能な文字を含まない場合(例えば、 ~)。一般的には避けてください。変数を二重引用符で囲むことなく逆参照します。
  • "$f":だからいかなる場合での作品や間接参照に唯一の正しい方法である(すなわちの値を取得する)変数

、あなたはあなたのforループで"$f"を使用する必要があり、その場合はそれでも動作しない場合、エラーは別の場所にある必要があります。


エラーメッセージがある場合:

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

は、その後、あなたは、現在のディレクトリには.txtファイルを持っていないと、バッシュは、AWKに渡されたファイル名として*.txtを使用しています。

あなたはグロブ拡張検証を可能にすることによって、この共通の問題を防ぐことができます。

shopt -s nullglob 

をこの場合、グロブ*.txtに一致するファイルがない場合、bashはAWKにあらゆるファイル名を渡しません。

+1

@EdMorton私は、原則としてスクリプトを動作させるオプションに焦点を当てていましたが、逆参照されるときに常に変数を二重引用符で囲む必要があります(引用は実際に意図された行動)。私はそれに応じて私の答えを編集しました。 – weibeld

関連する問題