我有一些看起来像这样的文件:
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
答案 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
选项。