2016-05-28 1 views
0

私は初心者です。以下のコードを修正して実行時間を短縮しようとしています。 (今は時代がかかります)可能であれば、助けや提案をお願いします。あらかじめありがとうございます。 list.txtにと仮定すると入れ子のforループの可能な修正

#!/bin/sh 
for pheno in `cat /wrk/abc/composition/results/list.txt`; do 
    header=`head -1 /wrk/abc/composition/results/"$pheno"/meta_"$pheno".out` 
    echo "pheno $header" > results.txt 
    for pheno in `cat /wrk/abc/composition/results/list.txt`; do 
    awk -v p="$pheno" \ 
     'NR == FNR{a[$1]; next}($3) in a{print p, $0}' \ 
     list.txt \ 
     /wrk/abc/composition/results/"$pheno"/meta_"$pheno".out \ 
     >> results.txt 
    done 
done 
+1

入力ファイルと出力ファイルを表示し、最初にawkコマンドのみを使用した場合の結果を確認します。 –

答えて

1

ライン分離され、ここでは簡略同じコードが(while read秒間スワップforループ)、無駄なcat Sと、だ、と読めない長いパスを低減するcdを使用し、続いていくつかのノートによって。それは少しだけ速くなり、そして、そのようなことがあったように、以前のように同じを動作するはずです:

cd /wrk/abc/composition/results/ 
while read pheno ; do 
    { echo -n pheno; head -1 "$pheno"/meta_"$pheno".out ; } \ 
     > results.txt 
    while read pheno ; do 
     awk -v p="$pheno" \ 
      'NR == FNR{a[$1]; next}($3) in a{print p, $0}' \ 
      list.txt \ 
      "$pheno"/meta_"$pheno".out \ 
      >> results.txt 
    done < list.txt 
done < list.txt 
cd - 
mv /wrk/abc/composition/results/results.txt ./ 

最も明白な誤りが二つのループ、他にネストされた1があるということです。どちらも同じ変数名($ pheno)を使用し、両方とも同じファイル(list.txt)を入力します。驚くべきことに、その種のコードは混乱しても正しく機能するかもしれません。しかし、内部ループが同じ入力ファイルでawkを実行するため、これは減速を引き起こすはずです。したがって、list.txtに100行がある場合、そのファイルは1,000,000回読み込まれる可能性があります。

次に、内側ループにデータを追加RESULTS.TXT、そこだし、アウターループサイクルごとに上書きします。 results.txtは、最後のサイクルのデータだけで埋められます。

+0

すっごくありがとう!私はあなたのコードを消化しようとします:) – HoHoHo

+0

申し訳ありませんが、私はあなたのコードをlist.txt内の1つの変数だけを実行すると - awk:(FILENAME = meta_var_pros.out FNR = 10453692)致命的: (そのようなファイル、又はディレクトリはありません)。なぜそれが起こることができますか?ありがとうございました。 – HoHoHo

+0

正しいpwdに戻るには、awkの前のどこかでcdを使う必要がありますか? – HoHoHo

関連する問題