0

I would like to combine files with similar ID before first underscore into one file using cat. How do I do this for multiple files like below?
Thought of something like this:

for f in *.R1.fastq.gz; do cat "$f" > "${f%}.fastq.gz"; done

in

9989_L004_R1.fastq.gz
9989_L005_R1.fastq.gz
9989_L009_R1.fastq.gz
9873_L008_R1.fastq.gz
9873_L005_R1.fastq.gz
9873_L001_R1.fastq.gz

out

9989.fastq.gz
9873.fastq.gz
oguz ismail
  • 1
  • 16
  • 47
  • 69
user2300940
  • 2,355
  • 1
  • 22
  • 35

2 Answers2

3
for f in *_R1.fastq.gz; do cat "$f" >> "${f%%_*}.fastq.gz"; done
  • >> for appending,
  • ${f%%_*} removes the longest suffix in $f matching _*.
oguz ismail
  • 1
  • 16
  • 47
  • 69
1

Here is another way:

for f in *_R1.fast1.gz; do 
   [[ -f "${f%%_*}.fastq.gz" ]] || cat ${f%%_*}_*_R1.fast1.gz > "${f%%_*}.fastq.gz"
done

or if you want to have it a bit more readable:

for f in *_R1.fast1.gz; do 
   key="${f%%_*}"
   [[ -f "${key}.fastq.gz" ]] || cat ${key}_*_R1.fast1.gz > "${key}.fastq.gz"
done
kvantour
  • 25,269
  • 4
  • 47
  • 72