我最近尝试使用linux(来自windows),我发现很难将以下windows命令处理到linux bash。
Windows命令是:
set /p cutoff=Set BLAST E-Value Cutoff[1e-]:
for %%F in (*.fa) do program.exe -parameter1 %%F -parameter2_cutoff 1e-%cutoff% -output_file %%~dpnF.fas & type %%F %%~dpnF.fas > %%~dpnF.txt
此脚本从用户获取数值并使用它在具有所需截止值的文件夹上的每个.fa文件中运行程序。这里%% ~dpnF只接受文件名(没有文件扩展名)。在这个脚本中,我加入每个输入文件(.fa)的内容及其生成的输出(.fas),最后将它们合并到最终输出(.txt)中。在这里,对于每个输入文件,将有一个最终输出文件。
要在ubuntu中运行它,我尝试
echo "Set BLAST E-Value Cutoff[1e-]:"
read cutoff
for $f in *.fa; do program -parameter1 $f -parameter2_cutoff 1e-$cutoff -output_file $~dpnF.fas & cat $f $~dpnF.fas > $~dpnF.txt; done
它立即显示linux在Windows中不支持dpn类型的命令,并且脚本突然终止,没有输出。
虽然我理解不同的文件扩展名在linux中没有多大意义,但我必须保持这种方式让其他程序处理它们。
我感谢任何类型的帮助。
由于
答案 0 :(得分:3)
序列%~dpn用于获取:
检查the meaning of all expansions here。
该驱动器在Linux中没有任何意义。可以使用命令dirname
提取完整或部分路径,并且可以使用命令basename
提取文件名。
序列%%~dpn
表示从根(/
)获取整个路径名。
实际上,在Linux中不需要这样,如果使用*.f
创建文件列表,文件列表将相对于"当前工作目录" (命令pwd
),无需扩展它们。
要从文件名中删除扩展名,请使用${f%.*}
这削减了" $ f"在最后一个点.
以及*
后面的任何内容
然后只需添加所需的扩展程序:${f%.*}.fas
此外,角色&具有&#34的含义;在后台运行前一个命令",这不是你想要的。
最后,for $f
应替换为for f
。
这是一个更干净的翻译:
echo "Set BLAST E-Value Cutoff[1e-]:"
read cutoff
for f in *.fa; do
program -parameter1 "$f" \
-parameter2_cutoff "1e-$cutoff" \
-output_file "${f%.*}.fas"
cat "$f" "${f%.*}.fas" > "${f%.*}.txt"
done