如何对第一个下划线之前具有相同字符串的文件执行循环?

如何对第一个下划线之前具有相同字符串的文件执行循环?

我正在尝试在 Ubuntu 上执行一个循环,将两个文件连接成一个文件。该目录有数千个文件,它们都是成对出现的,在第一个下划线之前具有相同的字符串。例如,该目录包含以下文件:

uce-1348_.nexus.phy.fasta
uce-1348_Sample1.fasta
uce-1611_.nexus.phy.fasta
uce-1611_Sample1.fasta

我曾尝试过做一些类似的事情

for i in *_*.fasta \
do
cat $i > $i.combined.fasta
done

但这当然行不通,因为它不会使合并的文件特定于第一个下划线之前的字符串。我需要一个 uce-1348 的连接文件和另一个 uce-1611 的连接文件(还有数千个文件,但这只是我正在寻找的一个小例子。

任何帮助都将不胜感激。我听说你可以设置字符串和模式,但我仍然不知道如何做到这一点。谢谢!

答案1

您可以像以前一样循环遍历文件,但随后需要提取文件名的开头来定义输出文件。

然后您必须使用>>添加到输出文件。如果您使用单个,>它每次都会覆盖内容。

因此,使用您的文件名:

for file in *_*.fasta; do
    output="${file/_*}.combined.fasta"
    cat "$file" >> "$output"
done

该表达式${file/_*}使用Shell 参数扩展删除文件名中第一个“_”后面的所有内容,以生成输出文件名。

答案2

你需要循环模式,并使用生成其他文件名参数扩展

前任。

for i in *_.nexus.phy.fasta; do 
  cat "$i" "${i/.nexus.phy/Sample1}" > "${i/_.nexus.phy/.combined}"
done

答案3

除了复制和移动之外mmv还可以将源文件的内容附加到目标名称。

mmv -a 'uce-*_*' 'uce-#1.combined.fasta'

相关内容