2016-09-23 7 views
0

エラーチェックのためにファイルの最後を確認しようとしています。私はawkで動作させようとしていますが、awkで計算された値は私のbashに戻すことはできません。Bash:ファイル内の値を確認してください

s=0 
f=0 

for ((i=0;i<num_inf;i++)) do 
    ii=${inf[$i]} 

    for ((j=0;j<num_gro;j++)) do 
     jj=${gro[$j]} 

     for ((k=0;k<num_tri;k++)) do 
      kk=${tri[$k]} 
      awk 'END{x=($2+$8);if($x<10) ((f++)) ;else ((s++))}' $ii/$jj/$kk/out.dat 
     done 

    printf '%2s' "$s" 
    printf '%2s' "$f" 
    s=0 
    f=0 

    done 
done 

返さsおよびFここでのif-elseテストがあるので、常に0です、私はSの少なくとも一つを期待して、fはゼロ以外の値を返します。

誰でもawkの使用経験がありますか?私はbashとawkの初心者です。または、誰かがawkをバイパスするための提案を持っている/より簡単なソリューションがありますか?

ありがとうございます。ここ

+1

AWKプロセスは、単独で実行されます。 's'と' t'の値をファイルの最後に当てて出力し、bashで '$(' ... ')'を使ってこの結果を取得します。 – Jasen

+0

awkから数値を出力する場合、その数値をシェルスクリプトが読み込みコマンドにパイプすることで読み取ることができます。 – blackpen

+0

これは保護された環境なので、次のように 'eval'を使うことができると思います: ' eval "$(awk 'END {x =($ 2 + $ 8); if($ x <10)echo" ");" else "echo"((s ++)) "}" "$ ii/$ jk/$ kk/out.dat") "' – anishsane

答えて

0

が再びawkbashから変数を渡すの例です:

result=$(awk -v f=$f -v s=$s ' 
    END{x=($2+$8); 
    if($x<10) ((f++)); 
    else ((s++)); 
    printf "%d\t%d\n", $f,$s 
}' $ii/$jj/$kk/out.dat) 
f=$(echo "$result" | cut -f1) 
s=$(echo "$result" | cut -f2) 
+0

注意:パイプシンボルは、おそらく、ロット全体がサブシェルで実行され、 'f'と' s'に読み込まれた値がメインシェルで利用できないことを意味します。これを回避する方法があります(プロセス置換、 'shopt -s lastpipe'など)。 –

+0

これは本当です。 "一定"。 – webb

+0

ありがとうございます。これは、 'bash'と 'awk'の間で値を渡すための非常に明確なデモです – Simon

0

ここで簡単にオプションです:

x=$(tail -n1 $ii/$jj/$kk/out.dat | awk '{print $2+$8}') 
[ "0$x" -lt 10 ] && f=$(expr $f + 1) || s=$(expr $s + 1) 

は説明:

  1. の最後の行を取得しますこのout.datは、フィールド2 & 8を追加し、結果をxに格納します。
  2. X < 10であれば、Fをインクリメントし、その変数はbashのに見えないので、他の増分の
+0

あなたの解決に感謝!しかし、あなたが["0 $ x" -lt 10]を説明すると気になりますか?私はそれがどのように動作するかを学ぼうとしています。 – Simon

+0

これは、$ xが時には "可能かもしれない"という可能性を扱う伝統的な方法です。この場合、 '' $ x -lt 10 ''や' ["$ x" -lt 10] 'はどちらもエラーを引き起こしますが、' '0 $ x" 'は0と評価されます。 – webb

+1

私が正しく理解している場合、 '$ x = 10'、' '0 $ x" = 010'はまだ動作します。ちょうどその場合には '$ x =空白' ありがとう! – Simon

関連する問題