我对 unix 和 linux bash 脚本比较陌生,有几个问题:
首先这是我的脚本:
for fileref in Ref/*.bed; do
for filename in Data/*.bed; do
bedops -e 1 $fileref $filename > "${fileref}${filename}.out"
done
done
我想使用两个文件(通过循环每个目录收集的)作为输入来执行命令 bedops -e ,并让输出文件是两个文件名的串联(最好在末尾没有 .bed )。有没有好的方法可以做到这一点?
答案1
您可以使用参数扩展删除父目录Ref
并Data
包含/
和 删除.bed
文件名中的后缀。
${varname##*/}
删除最大的前缀模式以删除父路径${varname%.bed}
删除最小后缀模式以删除.bed
文件扩展名
for fileref in Ref/*.bed; do
fref=${fileref##*/}
fref=${fref%.bed}
for filename in Data/*.bed; do
fname=${filename##*/}
fname=${fname%.bed}
bedops -e 1 "$fileref" "$filename" > "${fref}${fname}.out"
done
done
basename
使用打印给定路径的文件名并可选择删除后缀的命令可以实现相同的效果:
for fileref in Ref/*.bed; do
for filename in Data/*.bed; do
bedops -e 1 "$fileref" "$filename" > "$(basename "$fileref" ".bed")$(basename "$filename" ".bed").out"
done
done
答案2
您可以使用basename
删除目录(*)和扩展名:
for fileref in Ref/*.bed; do
for filename in Data/*.bed; do
bedops -e 1 $fileref $filename > "$(basename $fileref .bed)-$(basename $filename .bed).out"
done
done
(*) 因为for fileref in Ref/*
将迭代Ref/File1
,Ref/File2
因此保留输出文件的目录将类似于“Ref/File1-Data/File2.out”。