我正在尝试在 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'