2012-06-30 38 views
0

如果有人可以帮我编写一个循环来迭代文件夹中的文件,它会为我节省大量的时间。我认为它必须是一个相当简单的解决方案,但我目前不知道如何在循环中嵌套一个循环。到目前为止,我有这个脚本:排序命令不能按预期工作

cd /folderlocation/ 
for i in `</textfile_containing_lines_to_iterate_through` 
do 
#size=`echo $i | perl -nE '/:([\d-]+)/ && say abs(eval $1)'` 
    #echo "$size" 
zcat dataset | head -n 18 > temp"$i".vcf 
tabix dataset $i >> temp"$i".vcf 
vcftools --window-pi 1000000 --vcf temp10individuals"$i".vcf >> run_summary.txt 
cat out.windowed.pi >> outputfile_2 
    #rm temp* 
done 
grep -v "PI" outputfile_2 > outputfile 
rm outputfile_2 

我需要扩大这一点,以便将运行该脚本多次,通过所有的“textfiles_containing_lines_to_iterate_through”的。目前,我每次都手动更改文本文件的名称,然后重新运行该脚本。所以我需要一个循环来处理文件夹中的文件,并且使用文件的名称作为输出文件名称的一部分,以便我可以将输出文件与输入文件相匹配。

任何帮助将非常有用,非常感谢!

非常感谢提前。

+1

这是什么都做'sort'? – Shahbaz

回答

1

您可以像任何其他语言一样嵌套循环。你只是在另一个里面写一个。

让我们先来看看如何通过所有文件循环在当前目录:

for file in * 
do 
    do_something_with $file 
    or_generate ${file}_changed 
done 

现在你的整个脚本变为:

cd /folderlocation/ 
for f in * 
do 
    for i in `<$f` 
    do 
    #size=`echo $i | perl -nE '/:([\d-]+)/ && say abs(eval $1)'` 
    #echo "$size" 
    zcat dataset | head -n 18 > temp${i}.vcf 
    tabix dataset $i >> temp${i}.vcf 
    vcftools --window-pi 1000000 --vcf temp10individuals${i}.vcf >> run_summary.txt 
    cat out.windowed.pi >> outputfile_2 
    #rm temp* 
    done 
    grep -v "PI" outputfile_2 > output_${file} 
    rm outputfile_2 
done 
+0

似乎没有工作,管道没有输入,是否有一个简单的方法来测试如果f *中找到文件? – user964689

+0

写完第一个'do'后,写'echo $ f'来检查。 – Shahbaz

+0

我个人从来没有在''<... \''之前看过'<...',因此我不知道这是否正确,但是您也可以始终使用'for i in \'cat $ f'' – Shahbaz

1

遍历文件的文件夹中,

for i in folder/*; 
do <whateveryouwanttodo>; 
done; 

希望这有助于。 :)