合并文件名中具有类似子字符串的文件

时间:2019-05-27 18:58:25

标签: bash

我想在FIRST下划线“ _”之前合并具有相似ID的文件。下面是两个这样的文件的示例。我认为cat是可以使用的工具。

在:

EIV105_S21_R1.fastq.gz 
EIV105_2_S117_R1.fastq.gz
EIV10_S13_R1.fastq.gz
EIV10_2_S109_R1.fastq.gz 

退出:

EIV105_R1.fastq.gz 
EIV10_R1.fastq.gz

2 个答案:

答案 0 :(得分:1)

#!/bin/sh

suffix=R1.fastq.gz

find *_?*_$suffix | sed 's/_.*//' | sort -u |\
while read id; do
    cat "$id"_?*_$suffix > "$id"_$suffix
    # gzip -cd "$id"_?*_$suffix | gzip > "$id"_$suffix
done
  • find列出输入文件名
  • sed提取ID
  • sort仅输出唯一的ID
  • while遍历唯一的id(假设它们不包含反斜杠或换行符之类的不寻常字符)
  • cat创建输出
  • gzip可能比cat压缩效果更好

答案 1 :(得分:0)

这里使用进程替换来馈送while循环(创建组合的gzip文件)的jhnc答案略有不同,例如

#!/bin/bash

suffix=R.fastq.gz
while read -r prefix; do
    cat "${prefix}_"* > "$prefix.$suffix"
done < <(for i in *.gz; do echo ${i%%_*}; done | sort -u)

它使用for循环来隔离和收集当前目录中每个现有gzip文件的唯一前缀,然后将该唯一列表重定向为while循环的输入。

注: 进程替代,例如<(process)是bem中可用的 bashism ,但在POSIX shell中不可用。重定向进程替换以进行while循环,重定向和进程替换之间必须有一个空格,例如< <(process)