For loop 用于文件名配对的循环

For loop 用于文件名配对的循环,for-loop,awk,For Loop,Awk,我正在尝试创建一个脚本,该脚本将在for循环中识别目录中的文件对,然后对每对文件执行一个函数。成对的文件命名为FILENAME_1.fastq和FILENAME_2.fastq,目录中有多对。以下是一些实际的文件名,以防它与正则表达式函数有关: WT1_0min-SRR9929263_1.fastq WT1_0min-SRR9929263_2.fastq WT1_20min-SRR9929265_1.fastq WT1_20min-SRR9929265_2.fastq WT3_20min-SRR

我正在尝试创建一个脚本,该脚本将在for循环中识别目录中的文件对,然后对每对文件执行一个函数。成对的文件命名为FILENAME_1.fastq和FILENAME_2.fastq,目录中有多对。以下是一些实际的文件名,以防它与正则表达式函数有关:

WT1_0min-SRR9929263_1.fastq
WT1_0min-SRR9929263_2.fastq
WT1_20min-SRR9929265_1.fastq
WT1_20min-SRR9929265_2.fastq
WT3_20min-SRR12062597_1.fastq
WT3_20min-SRR12062597_2.fastq
除了文件名有一对外,是否可以在不提供任何文件名信息的情况下执行此操作?我对正则表达式和名称搜索功能非常糟糕,但下面是我最近一次失败的尝试

cd ~/Directory

for file in *.fastq
do
  sample=`basename ${file}` #I think needs a modification to subtract the _1 or _2 and then a search function to find the paired files
  myfunction \
         -1 ${sample}_1.fastq \
         -2 ${sample}_2.fastq \
done

谢谢你的帮助。被卡住2天x_x

使用
find
xargs
,并用您选择的命令替换
echo

find . -name '*_1.fastq' -exec basename {} '_1.fastq' \; | xargs -n1 -I{} echo {}_1.fastq {}_2.fastq

若要说明并非每个文件都已完全配对的情况,请尝试

file . -depth 1 type f -not -name ".*" | \
 \
  gawk 'BEGIN { FS="_"; } { $ 0 = gensub(/^.+\/([^\/]+)$/ , "\\1", "1"); } 
              { inL[$1$2][substr($3,1,1)] = $0 ; }   
          END { OFS = ORS = "\0"; 
                    for (pfx in inL) { 
                        if (1 in inL[pfx]) && (2 in inL[pfx]) && \
                           (length(inL[pfx])==2)
              { print inL[pfx][1], inL[pfx][2]; } } }' | \
  \ 
  parallel -0 -N 2 -j 1 myfunction -1 '{}' -2 '{}' ;

gnu并行允许导出函数。此版本的代码将使用gawk处理basename和print0函数。这也确保了最后只显示具有精确1+2配对的文件,如果有的文件只有2个配对中的一个,或者有些文件甚至带有“_3.fastq”,那么您需要扩展到这样一个领域。

在生物信息学中,当有配对的末端运行时,我们始终使用此选项:

parallel --plus echo {} {/_1.fastq/_2.fastq} ::: *_1.fastq
或:


非常感谢。我将尝试将其与if/then参数结合起来。有些情况下,对不存在,需要将这些文件送入不同的for循环。目前,我将成对和非成对文件放在单独的目录中,每个目录都有两个独立的脚本。=)此外,您的文件名是否已经是ASCII和/或SMB安全的?我看到你在做生物测序数据。如果你的工作跨越了每工作运行200兆的范围,考虑在MAWK上改写GAWK(免责声明:与作者零关系——我只是喜欢它疯狂的速度)。这意味着必须伪造多维数组,并且必须绕过gensub。我已经重新编写了我自己的实用程序funcs,将mawk1.3、mawk2 beta和gnu混合到一个点上,它在计数行上优于内置的wc,在简单正则表达式上优于tr和gnu,在url编码上优于python3。
parallel echo {} {=s/_1.fastq/_2.fastq/=} ::: *_1.fastq