2012-06-30 37 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; 

希望這有助於。 :)