我是新手,我正在尝试修改下面的代码,以便花费更少的时间来运行。 (现在需要很长时间。)如果可能的话,请帮助或提出任何建议。先谢谢你。
#!/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
答案 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 只会填充最后一个周期的数据。