使用多个输入文件并行化awk脚本,并更改输出文件的名称



我在文件夹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分钟)处理所有文件!

相关内容

  • 没有找到相关文章

最新更新