如何使用 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。