合并 ID 在下划线之前的文件

Merge files with ID before underscore

我正在寻找一种方法来合并文件名中第一个下划线之前具有相同 ID 的文件。输出应仅包含 ID,后跟 fastq.gz。必须对输出进行 gzip 压缩。

0394_L007_R1.fastq.gz 
0394_L008_R1.fastq.gz 
0444_L005_R1.fastq.gz 
0444_L006_R1.fastq.gz 

出来

0394.fastq.gz
0444.fastq.gz

更方便的东西
cat 0394_L007_R1.fastq.gz  0394_L008_R1.fastq.gz   > 0394.fastq.gz

首先,在关联数组中收集唯一标识符:

declare -A ids
for f in *.fastq.gz; do
  ids[${f%%_*}]=1
done

然后使用 gzcat 将每个文件的(未压缩的)内容通过管道传输 将文件匹配到 gzip 以将输出重新压缩到单个文件中。

for id in "${!ids[@]}"; do
  gzcat "$id"_*.fastq.gz | gzip -c > "$id".fastq.gz
done

(或者,因为我忘记了串联的 Gzip 文件本身就是有效的 Gzip 文件,

for id in "${!ids[@]}"; do
  cat "$id"_*.fastq.gz > "$id".fastq.gz
done

)

使用一个简单的命令:

ls | tr '_' '.' |切-d'。' -f1,4,5 | uniq

一个不断附加到目标文件的简单循环。所以这实际上只是为当前文件找到正确的 "target file" 并附加到它的问题。

#! /bin/bash
for x in *.fastq.gz; do
     currid=$(echo "$x" | cut -d'_' -f1)
     cat "$x" >> "$currid".fastq.gz
done