基于正则表达式合并多个文件



如何使用 for 循环合并两个在下划线之前具有匹配字符/数字的文件?我的目录中有很多文件

输入:

SRR9200887_1.fastq
SRR9200887_2.fastq
SRR9200888_1.fastq
SRR9200888_2.fastq
SRR9200889_1.fastq
SRR9200889_2.fastq

预期产出:

SRR9200887.fastq
SRR9200888.fastq
SRR9200889.fastq

我的尝试:

for l in $(ls *.fastq | cut -d_ -f1 | sort |uniq); do cat ${l}*.fastq

bash及其参数扩展:

for i in *_1.fastq; do
cat "${i%_*.fastq}_1.fastq" "${i%_*.fastq}_2.fastq" > "${i%_*.fastq}.fastq";
done

${i%_*.fastq}输出$i,无需_,所有输出都遵循它,例如SRR9200887.

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

要将文件cat在一起,假设每个"SRR"都有匹配的"_1.fastq"和"_2.fastq",一个可能的选择是:

SRR_array=(*_1.fastq)
for f in "${SRR_array[@]%%_*}"
do
cat "$f"_1.fastq "$f"_2.fastq > "$f".fastq
done

如果要在将 _1.fastq 和 _2.fastq 文件合并在一起后删除它们:

SRR_array=(*_1.fastq)
for f in "${SRR_array[@]%%_*}"
do
cat "$f"_1.fastq "$f"_2.fastq > "$f".fastq
rm "$f"_1.fastq "$f"_2.fastq
done

一个bash想法:

while read -r pfx
do
cat "${pfx}"_*.fastq >> "${pfx}".fastq
done < <(find . -name "*_*.fastq" | cut -d'_' -f1 | sort -u)

调整OP的当前代码:

for l in $(ls -1 *_*.fastq | cut -d_ -f1 | sort | uniq)
do
cat ${l}_*.fastq >> "${l}".fastq
done

哪里:

  • 我们查找名称中带有_的文件;如果脚本运行多次,这将确保我们不会拾取以前的串联文件
  • 确保ls每行列出一个文件(因此-1)
  • 在这种情况下,sort | uniq可以替换为sort -u

使用任何 awk(未经测试):

awk '
FNR==1 {
out = FILENAME
sub(/_[0-9]+/,"",out)
if ( out != prev ) {
close(prev)
prev = out
}
}
{ print > out }
' *_*.fastq

这将连接具有相同后缀的文件,无论有多少文件具有相同的后缀,而不仅仅是 2。

最新更新