在unix中将不同的文件放在一起

catting together different files in unix

我有一个文件夹,里面有一堆文件,我想把特定的文件放在一起。布局是这样的:

sample1_S99_L1_R1_001.fastq.gz
sample1_S99_L2_R1_001.fastq.gz

sample1_S99_L1_R2_001.fastq.gz
sample1_S99_L2_R2_001.fastq.gz

sample2_S88_L1_R1_001.fastq.gz
sample2_S88_L2_R1_001.fastq.gz

sample2_S88_L1_R2_001.fastq.gz
sample2_S88_L2_R2_001.fastq.gz

等等不同的样本。 我想将 cat sample1_S99_*_R1_001.fastq.gz 放入 1 个 gunzip 文件中。所以上面代码中分组的样本应该放在一起。

手动我会做这样的事情:

cat sample1_S99_L1_R1_001.fastq.gz sample1_S99_L2_R1_001.fastq.gz > sample1.R1.fastq.gz

cat sample1_S99_L1_R2_001.fastq.gz sample1_S99_L2_R2_001.fastq.gz > sample1.R2.fastq.gz

我的想法是让这个过程自动化,我想到了这个:

ls | awk -F '[_.]' '{print }' > test.txt
sort -u test.txt > names_final.txt
while read line;do cat $line_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat $line_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt

我现在面临的问题是这些命令似乎将所有 R1 文件放在一起。例如,如果我输入

ls sample1_*_*_R1_*.fastq.gz 

我只得到了我要整理的文件。所以我不确定我的错误是否在这里。

有人有想法吗?

提前致谢。

$line_*_*_R1_*.fastq.gz 被解析为 ${line_}*_*_R1_*.fastq.gz 因为下划线是变量名中的有效字符。带下划线的 $line_ 为空,因此 glob *_*_R1_*.fastq.gz 与前导星号对应的所有样本名称相匹配。

使用显式花括号解决此问题。

while read line;do cat ${line}_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat ${line}_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt

我会用双 for:

for i in {00..99}; do
   for j in 1 2; do
       cat sample1_S${i}_L*_R${j}_001.fastq.gz >> sample1.S$i.R$j.fastq.gz
   done
done

这将遍历所有文件,并将 cat 具有相同 sample1_SXX_RYY 的文件放在一起。

注意两点:

  • 您可能需要 zcatcat 个 gzip 文件。
  • 使用变量定义名称范围时大括号的用法:echo $a_c 尝试回显变量 a_c,而 echo ${a}_c 回显变量 $a 然后 _c.