迭代文件并对其执行操作

迭代文件并对其执行操作

我对 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

您可以使用参数扩展删除父目录RefData包含/和 删除.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/File1Ref/File2因此保留输出文件的目录将类似于“Ref/File1-Data/File2.out”。

相关内容