【问题标题】:Concatenate files together that have similar names将具有相似名称的文件连接在一起
【发布时间】:2019-12-27 06:45:20
【问题描述】:

我有一些看起来像这样的文件:

418_S32_L003_R1_001.fastq.gz
418_S32_L003_R2_001.fastq.gz
418_S1_L002_R1_001.fastq.gz
418_S1_L002_R2_001.fastq.gz
419_S32_L003_R1_001.fastq.gz
419_S32_L003_R2_001.fastq.gz
419_S1_L002_R1_001.fastq.gz
419_S1_L002_R2_001.fastq.gz

每组四个文件的第一个数字不同。
如果*R1**R2* 的值相同,则应将以相同编号开头的样本组合在一起。

所以,这两个样本应该连接起来:

418_S32_L003_R1_001.fastq.gz
418_S1_L002_R1_001.fastq.gz

这两个应该连接起来:

419_S32_L003_R2_001.fastq.gz
419_S1_L002_R2_001.fastq.gz

并且应该对目录中的所有文件重复此操作。

除了像这样手动连接之外,在 bash 中是否有更好的方法来做到这一点:

cat 418_S32_L003_R1_001.fastq.gz 418_S1_L002_R1_001.fastq.gz > 418_R1.fastq.gz

【问题讨论】:

  • 生成有问题的文件名列表。 sort 这个列表,通过将_ 定义为字段分隔符,由第一个和第四个字段组成。如果您的目录中没有具有奇怪名称的文件(即带有嵌入换行符的名称),这是sorted=( $(ls *.fastq.gz|sort .....) ) 这为您提供了一个新的有序列表,其中要连接的文件的名称彼此相邻.现在按顺序处理列表,只要“键值”(418,R1)发生变化,就会打开一个新的输出文件。查看 bash 手册页,了解如何从字符串中提取这些键值的正则表达式。

标签: string bash file


【解决方案1】:

这可能对你有用(GNU 并行):

parallel --dry-run -N4 --plus cat {1} {4} \> {1%_.*}_R1.{1+..} ::: *R[12]*

这将打印出预期的cat 命令,检查结果,如果确定则删除--dry-run 选项。

【讨论】:

    【解决方案2】:

    您可以读取每个文件并将其附加到您可以从文件名中获取的目标文件中。

        for file in *.fastq.gz;
        do
            IFS='_' read -a array <<< $file;
            name="${array[0]}_${array[3]}.fastq.gz";
            cat $file >> $name;
        done
    

    【讨论】:

      【解决方案3】:
      a = 0
      for i in *
      do
      for j in *
      do 
      if [ $(echo $j |cut -d _ -f 1) = $(echo $i |cut -d _ -f 1) ]
      then 
      cat $i $j > $a
      a = a + 1
      fi
      done
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2022-11-25
        相关资源
        最近更新 更多