将名称相似的文件连接在一起

时间:2019-08-22 01:21:12

标签: string bash file

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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