可能修改嵌套for循环

时间:2016-05-28 18:51:45

标签: shell command-line

我是新手,我正在尝试修改下面的代码,以便花费更少的时间来运行。 (现在需要很长时间。)如果可能的话,请帮助或提出任何建议。先谢谢你。

#!/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 个答案:

答案 0 :(得分:1)

假设 list.txt 是行分隔的,这里是相同的代码简化,没有无用的cat,(for循环交换为while read 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 ./

最明显的错误是有两个循环,一个嵌套在另一个循环中;两者都使用相同的变量名称( $ pheno ),两者都输入相同的文件( list.txt ) - 令人惊讶的是,这种代码可能正常运行,尽管令人困惑。但这必然会导致速度减慢,因为内部循环在同一个输入文件上运行awk。因此,如果 list.txt 中有100行,则该文件可能会被读取1,000,000次。

然后是 results.txt ,内部循环将数据附加到,并且外部循环会在每个循环中覆盖。因此, results.txt 只会填充最后一个周期的数据。