我在文件夹sub.yr_by_yr
中有一系列文本文件,我将其传递给for循环以从头文件中子集Beagle
文件。我想并行化这个脚本从头值的Beagle文件子集(这是使用我的subbeagle.awk
脚本完成)。使用bash (file11=${file1%.subbeagle.txt}
)中的基本模式匹配,我使用文本文件的标题将子集导出为新文件名,以获得所需的输出(MM.beagle.${file11}.gz
)
for file1 in $(ls sub.yr_by_yr)
do
echo -e "Doing sub-samples n $file1"
file11=${file1%.subbeagle.txt}
awk -f subbeagle.awk
./sub.yr_by_yr/$file1 <(zcat ../MajorMinor.beagle.gz) | gzip > sub.yr_by_yr_beagle.files/MM.beagle.${file11}.gz
done
for循环可以工作,但是要花很长时间…因此需要并行化。文件夹sub.yr_by_yr
包含>10个文件sp.yrseries.site1.1.subbeagle.txt
,sp.yrseries.site1.2.subbeagle.txt
,sp.yrseries.site1.3.subbeagle.txt
…
我试过了
parallel "file11=${{}%.subbeagle.txt}; awk -f $SUBBEAGLEAWKSCRIPT ./sub.yr_by_yr/{} <(zcat ../MajorMinor.beagle.gz) | gzip > sub.yr_by_yr_beagle.files/MM.beagle.${file11}.gz" ::: sub.yr_by_yr/*.subbeagle.txt
但是它给了我'bad substitution
'
如何并行使用awk脚本并相应地重命名文件?
subbeagle.awk
内容:
# Source: https://stackoverflow.com/questions/74451358/select-columns-based-on-their-names-from-a-file-using-awk
BEGIN { FS=OFS="t" } # uncomment if input/output fields are tab delimited
FNR==NR { headers[$1]; next }
{ sep=""
for (i=1; i<=NF; i++) {
if (FNR==1 && ($i in headers)) {
fldids[i]
}
if (i in fldids) {
printf "%s%s",sep,$i
sep=OFS # if not set elsewhere (eg, in a BEGIN{}block) then default OFS == <space>
}
}
print ""
}
MajorMinor.beagle.gz
内容
marker allele1 allele2 FINCH_WB_ID1_splitMerged FINCH_WB_ID1_splitMerged FINCH_WB_ID1_splitMerged FINCH_WB_ID2_splitMerged FINCH_WB_ID2_splitMerged
chr1_34273 G C 0.79924 0.20076 3.18183e-09 0.940649 0.0593509
chr1_34285 G A 0.79924 0.20076 3.18183e-09 0.969347 0.0306534
chr1_34291 G C 0.666111 0.333847 4.20288e-05 0.969347 0.0306534
chr1_34299 C G 0.000251063 0.999498 0.000251063 0.996035 0.00396529
更新:
我可以从这个来源得到这个:
parallel "awk -f subbeagle.awk {} <(zcat ../MajorMinor.beagle.gz) | gzip > 'sub.yr_by_yr_beagle.files/MM.beagle.{/.}_test.gz'" ::: sub.yr_by_yr/*.subbeagle.txt
唯一需要删除的花哨的东西是输入文件名的.subbeagle
参数…
所以并行教程在这里帮了我:
parallel --rpl '{mymy} s:.*/::; s:.[^.]+$::;s:.[^.]+$::;' "awk -f subbeagle.awk {} <(zcat ../MajorMinor.beagle.gz) | gzip > 'sub.yr_by_yr_beagle.files/MM.beagle.{mymy}.gz'" ::: sub.yr_by_yr/*.subbeagle.txt
让我们打破这个:
--rpl '{mymy} s:.*/::; s:.[^.]+$::;s:.[^.]+$::;'
--rpl
将"定义一个简短的替换字符串";(参见并行教程和另一个示例){mymy}
是我的'新'替换字符串,它将执行它之后的内容。s:.*/::;
是{/}
的定义(参见并行教程,搜索Perl表达式替换字符串",该节的最后一部分显示了7个'默认'替换字符串的定义)s:.[^.]+$::;s:.[^.]+$::;
删除了2个扩展名(所以.subbeagle.txt
,.txt
是第一个扩展名,.subbeagle
是第二个扩展名)"awk -f subbeagle.awk {} <(zcat ../MajorMinor.beagle.gz) | gzip > 'sub.yr_by_yr_beagle.files/MM.beagle.{mymy}.gz'"
是脚本的子集和压缩参数。请注意,
{mymy}
是将进行替换的地方。如您所见,{}
将在输入字符串中。其余的都不变!::: sub.yr_by_yr/*.subbeagle.txt
将把所有文件作为输入传递给并行。
我花了2个小时来处理至少5个文件,但使用22个内核,我可以在很短的时间内(约20分钟)处理所有文件!